MSTest:如何模拟依赖对象?

时间:2014-05-30 16:03:59

标签: vb.net mocking mstest

我是单元测试的新手,所以如果这是一个noob-question,请原谅我:

我试图测试一个功能:

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

MyClass.CheckSomething 函数正在访问正在进行数据库查询的全局共享方法

Public Function CheckSomething() as Boolean
    Dim length as Integer = GlobalModule.GetLegthFromDb()
    Return length > 0
End Function

GlobalModule 的内容:

Public Class GlobalModule

    Public Shared Function GetLegthFromDb() As Integer
        'pretend database is not available
        Throw New InstanceNotFoundException("DB Connetion not set")
    End Function
End Class

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

有没有办法模拟(或其他) GetLegthFromDb 方法进行测试?

2 个答案:

答案 0 :(得分:1)

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")

答案 1 :(得分:0)

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

我使用Microsoft Fakes来模拟共享函数。

<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

MockTest 是我项目的命名空间。