面试题答案
一键面试- 使用接口抽象外部服务
- 首先,为外部服务定义一个接口。例如,如果外部服务是一个数据访问服务,定义如下接口:
Public Interface IDataAccessService Function GetData() As String End Interface
- 修改被测试代码以依赖接口
- 让被测试的类依赖于这个接口而不是具体的外部服务类。比如,有一个业务逻辑类
BusinessLogic
:
Public Class BusinessLogic Private _dataAccess As IDataAccessService Public Sub New(ByVal dataAccess As IDataAccessService) _dataAccess = dataAccess End Sub Public Function ProcessData() As String Dim data = _dataAccess.GetData() '对获取的数据进行处理 Return data.ToUpper() End Function End Class
- 让被测试的类依赖于这个接口而不是具体的外部服务类。比如,有一个业务逻辑类
- 在单元测试中使用模拟对象(依赖注入)
- 在Visual Basic单元测试框架(如
Microsoft.VisualStudio.TestTools.UnitTesting
)中,创建一个测试类:
Imports Microsoft.VisualStudio.TestTools.UnitTesting <TestClass()> Public Class BusinessLogicTest <TestMethod()> Public Sub ProcessDataTest() '创建模拟的IDataAccessService对象 Dim mockDataAccess As New MockDataAccessService() Dim businessLogic As New BusinessLogic(mockDataAccess) Dim result = businessLogic.ProcessData() Assert.AreEqual("TEST DATA", result) End Sub End Class '模拟的IDataAccessService实现类 Public Class MockDataAccessService Implements IDataAccessService Public Function GetData() As String Implements IDataAccessService.GetData Return "test data" End Function End Class
- 在Visual Basic单元测试框架(如
这样通过接口抽象外部服务,并在单元测试中注入模拟对象,实现了对依赖外部服务的被测试代码的单元测试。同时,如果使用第三方模拟框架(如Moq等,虽然在Visual Basic中相对使用较少,但也可引入使用),可以更方便地创建复杂的模拟对象,例如可以使用Moq
框架这样创建模拟对象:
Imports Moq
Imports Microsoft.VisualStudio.TestTools.UnitTesting
<TestClass()>
Public Class BusinessLogicTest
<TestMethod()>
Public Sub ProcessDataTest()
Dim mockDataAccess = New Mock(Of IDataAccessService)()
mockDataAccess.Setup(Function(x) x.GetData()).Returns("test data")
Dim businessLogic As New BusinessLogic(mockDataAccess.Object)
Dim result = businessLogic.ProcessData()
Assert.AreEqual("TEST DATA", result)
End Sub
End Class