2009-09-29 91 views
1

我该如何测试下面的代码?如何测试执行内部操作的引用类?

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 >")来调用与设备连接的组件。然后我们在这个组件上调用一个方法来设置存储在容器对象属性中的序列标识。

在SetupDeviceSerialID()方法中,我们调用“容器”原生的属性(例如,如果它是内部调试模式)以及其他一些对象。在对象中有对象的情况下测试这种情况的最佳方法是什么?我们会嘲笑所有的调用,属性和对象以隔离SetupDeviceSerialID()的测试吗?

或者我们模拟返回的'componentInterface'并嘲笑SetupDeviceSerialID()的调用,然后测试在SetupDeviceSerialID()内更改的属性?

编辑

我一直在思考这个测试不正确的(明显),并通过我认识到,我试图通过死记硬背的方法测试的答案代码执行更深,进入测试用于SetSerialIdForDevice()方法。

所以,作为一个结果, 如果发现serialID,我们会设置serialfound = trueSetupDeviceSerialID()内。
是我们在这里测试的东西(因为我们将测试serialfound=false),或者在测试SetupdDeviceSerialID()?我们是否会创建一个测试来查看“componentInterface”组件上是否实际存在SetupDeviceSerialID()

回答

1

更多信息接缝您可以放入代码中,测试就越容易。

如果你可以用Test Double替换getComponentRef方法的返回值,你可以编写一个测试来验证这个方法是否被正确调用,然后继续编写其他单元测试来验证其他东西。

理想情况下,您应该只写一个测试来测试任何特定的行为。

假设您可以用测试双替换component变量,然后可以验证SetupDeviceSerialID方法调用是否正确。

那么,以及一些行使错误路径的tets应该结束SetSerialIdForDevice方法的测试套件。

然后,您可以继续编写一组新的测试来验证某个特定的“组件”实现如预期的那样工作,但那些测试独立于执行SetSerialIdForDevice方法的测试。

2

我会模拟containergetComponentRef返回该方法可以测试的模拟对象。嘲笑每个“componentInterface”类都需要在他们自己的专用单元测试中发生。不要把测试责任结合起来,因为它很方便,把所有东西都当作自己的单位,所以没有单元测试依赖于另一个测试。

相关问题