我想对我所创建的类进行单元测试,但是这种方法需要先调用另一种方法.例:
// This would work MyClass myClass1 = new MyClass(mockDevice); myClass1.Run(myDatastructure); myClass1.Stop(); // This would throw an InvalidOperationException MyClass myClass2 = new MyClass(mockDevice); myClass2.Stop();
Run
正在硬件设备上启动操作Stop
,当然是尝试停止该操作(发送reset-command并启动timeout-timer).
无论如何,我想测试各种调用的后置条件Stop
,但我不想打电话Run
,因为我正在测试Stop
- 不是Run
!我想要这样的东西:
MyClass myClass = new MyClass(mockDevice); myClass.Stop(); Assert.IsTrue(mockDevice.ResetCalled);
到目前为止,我只看到一个可能的解决方案,那就是创建一个TestableMyClass
继承自的方法MyClass
,这样就可以MyClass
在调用之前设置实例的正确内部状态Stop
.这个解决方案的问题是我必须改变我的MyClass
实现以保护成员而不是私有成员,我不喜欢为了测试它而不得不改变实现的想法!
我应该使用这个解决方案吗,我的设计中是否有错误,或者有更聪明的方法吗?
据我看到它,你已经在测试Stop
中,它都可以使用(有和没有运行)两种方式.只要mockDevice
它正在完成它的工作,在我看来你正在合理地测试它.理想情况下,您应该能够验证发送到设备的命令等(大多数模拟框架都会变得简单).
在这种情况下,我个人将对此进行两个测试:
在不首先调用Run()的情况下进行测试。我会测试它是否真的抛出异常。我还将测试职位条件是否符合我的期望。
首先运行Run()进行测试。我只测试我期望的职位条件。
这些是该方法具有不同行为的仅有的两个重要用途-因此,我将对它们进行测试。
编辑:我了解,为什么您不希望在停止之前调用运行-您认为如果运行失败,则应该只测试停止方法的测试也很可能也会失败。
但是,我假设您还对run方法进行了测试。这意味着,在进行测试时,测试运行方法的行为通过-停止方法测试也必须通过。如果运行方法测试失败,那么运行方法测试的结果是不确定的-它们可能会也可能不会失败。
因此,我想说的是,不要害怕在测试中调用其他依赖方法,但要确保在单独的测试中测试那些依赖方法。