我如何测试以下代码?
Public Sub SetSerialIdForDevice()
Try
Dim component As Object = container.getComponentRef("componentInterface")
If component IsNot Nothing Then
component.SetupDeviceSerialID(container.serialNumbers)
Else
serialfound = False
End If
Catch ex As Exception
'' error handling
End Try
End Sub
项目引用(或在此处调用的组件)在运行时加载到单个“容器”中。我们使用container.getComponentRef("< name of component we're looking for >")
调用与设备接口的组件。然后,我们在此组件上调用一个方法来设置序列ID,该序列ID存储在容器对象的属性中。
在SetupDeviceSerialID()方法中,我们调用“容器”的本机属性(例如,如果它是内部调试模式)以及其他一些对象。测试这种情况的最佳方法是什么,我们在对象中有对象?我们是否会模拟所有调用,属性和对象以隔离SetupDeviceSerialID()的测试?
或者我们是否嘲笑返回的'componentInterface'
并模拟对SetupDeviceSerialID()
的调用,然后测试SetupDeviceSerialID()
内更改的属性?
修改
我一直在考虑不正确地测试这个(很明显)并且通过答案我已经意识到我正在尝试对代码中执行得更深入的方法进行测试,以及对SetSerialIdForDevice()方法的测试。 / p>
结果,
如果找到了serialID,我们会在 SetupDeviceSerialID()中设置serialfound = true
。
我们会在这里测试一下(因为我们将测试serialfound=false
),或者测试 SetupdDeviceSerialID()?我们是否会创建一个测试来查看“componentInterface”组件中是否存在 SetupDeviceSerialID()?
答案 0 :(得分:2)
我会模拟container
让getComponentRef
返回一个方法可以测试的模拟对象。模拟每个“componentInterface”类需要在他们自己的专用单元测试中发生。不要将测试职责结合起来,因为它很方便,将所有内容保留为自己的单元,因此单元测试不依赖于另一个测试。
答案 1 :(得分:1)
您可以将更多接缝放入代码中,测试就越容易。
如果可以使用Test Double替换getComponentRef
方法的返回值,则可以编写一个测试来验证是否已正确调用此方法,然后继续编写其他单元测试来验证其他内容
理想情况下,您应该只编写一个测试任何特定行为的测试。
假设您可以使用Test Double替换component
变量,则可以验证是否正确调用了SetupDeviceSerialID方法。
那么,以及一些运行错误路径的tets,应该结束SetSerialIdForDevice方法的测试套件。
然后,您可以继续编写一组新的测试,以验证特定的“组件”实现是否按预期工作,但这些测试将独立于执行SetSerialIdForDevice方法的测试。