Vb.net MSTest:如何模拟dependet对象?

Vb.net MSTest:如何模拟dependet对象?,vb.net,mocking,mstest,Vb.net,Mocking,Mstest,我是单元测试新手,如果这是一个noob问题,请原谅我: 我正在尝试测试一个函数: <TestMethod> Public Sub CheckSomethingTest() Dim testObject as new MyClass() Assert.IsTrue(testObject.CheckSomething(), "Check failed") End Sub GlobalModule的内容: 由于数据库不可用于测试,我得到一个Nullpoin

我是单元测试新手,如果这是一个noob问题,请原谅我:

我正在尝试测试一个函数:

<TestMethod>
Public Sub CheckSomethingTest()
        Dim testObject as new MyClass()
        Assert.IsTrue(testObject.CheckSomething(), "Check failed")
End Sub
GlobalModule的内容:

由于数据库不可用于测试,我得到一个Nullpointer异常


是否有任何方法可以模拟(或其他方式)用于测试的GetLegthFromDb方法?

GlobalModule
需要在类中注入,并且当您实例化要测试的类时,可以在该类中注入一个模拟的
GlobalModule
。它也有更好的接口

代码是用C#编写的,因为这对我来说比较容易,但你可能很容易翻译

public class MyClass()
{
  IGlobalModule _globalModule;
  public MyClass (IGlobalModule globalModule)
  {
     _globalModule = globalModule; // use this in the method
  }
  public bool CheckSomething()
  {
     return _globalModule.GetLegthFromDb() > 0;
  }
}
对于测试:

var mock = new Mock<IGlobalModule>();
mock.SetUp(m=>m.GetLegthFromDb()).Returns(100);//whatever you want to return    
var testObject = new MyClass(mock.Object);

Assert.IsTrue(testObject.CheckSomething(), "Check failed")
var mock=new mock();
SetUp(m=>m.GetLegthFromDb()).Returns(100)//无论你想要什么回报
var testObject=newmyclass(mock.Object);
Assert.IsTrue(testObject.CheckSomething(),“检查失败”)

经过一些额外的研究,我找到了一个符合我要求的解决方案:

我用来模拟共享函数

<TestMethod>
Public Sub CheckSomethingTest()
    Using s = Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create()
        MockTest.Fakes.ShimGlobalModule.GetLegthFromDb = Function() As Integer
                                                             Return 111
                                                         End Function

        Dim testObject As New MyClassA
        Assert.IsTrue(testObject.CheckSomething(), "Check failed")
    End Using
End Sub

公共子CheckSomethingTest()
使用s=Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create()
MockTest.Fakes.ShimGlobalModule.GetLegthFromDb=函数()为整数
返回111
端函数
Dim testObject作为新的MyClassA
Assert.IsTrue(testObject.CheckSomething(),“检查失败”)
终端使用
端接头

MockTest是我项目的名称空间。

Thx快速回答。问题是GetLengthFromDb是共享的(用C#words表示为静态的)。有没有模仿共享方法的选项?无论如何,你的回答对我和我理解使用单元测试和使用接口设计应用程序都很有用。谢谢,这就是我对vb语法的理解不足。我不认为你可以用moq模拟静态,我很想知道。但我相信你可以用MS Fake来模拟它。一些额外的信息:不幸的是,MS Fakes只在Visual Studio Ultimate中可用
var mock = new Mock<IGlobalModule>();
mock.SetUp(m=>m.GetLegthFromDb()).Returns(100);//whatever you want to return    
var testObject = new MyClass(mock.Object);

Assert.IsTrue(testObject.CheckSomething(), "Check failed")
<TestMethod>
Public Sub CheckSomethingTest()
    Using s = Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create()
        MockTest.Fakes.ShimGlobalModule.GetLegthFromDb = Function() As Integer
                                                             Return 111
                                                         End Function

        Dim testObject As New MyClassA
        Assert.IsTrue(testObject.CheckSomething(), "Check failed")
    End Using
End Sub