当前位置:  开发笔记 > 编程语言 > 正文

单元测试依赖方法

如何解决《单元测试依赖方法》经验,为你挑选了2个好方法。

我想对我所创建的类进行单元测试,但是这种方法需要先调用另一种方法.例:

// 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实现以保护成员而不是私有成员,我喜欢为了测试它而不得不改变实现的想法!

我应该使用这个解决方案吗,我的设计中是否有错误,或者有更聪明的方法吗?



1> Marc Gravell..:

据我看到它,你已经在测试Stop中,它都可以使用(有和没有运行)两种方式.只要mockDevice它正在完成它的工作,在我看来你正在合理地测试它.理想情况下,您应该能够验证发送到设备的命令等(大多数模拟框架都会变得简单).



2> Paulius..:

在这种情况下,我个人将对此进行两个测试:

    在不首先调用Run()的情况下进行测试。我会测试它是否真的抛出异常。我还将测试职位条件是否符合我的期望。

    首先运行Run()进行测试。我只测试我期望的职位条件。

这些是该方法具有不同行为的仅有的两个重要用途-因此,我将对它们进行测试。

编辑:我了解,为什么您不希望在停止之前调用运行-您认为如果运行失败,则应该只测试停止方法的测试也很可能也会失败。

但是,我假设您还对run方法进行了测试。这意味着,在进行测试时,测试运行方法的行为通过-停止方法测试也必须通过。如果运行方法测试失败,那么运行方法测试的结果是不确定的-它们可能会也可能不会失败。

因此,我想说的是,不要害怕在测试中调用其他依赖方法,但要确保在单独的测试中测试那些依赖方法。

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有