目前,我开始在我的单元测试中引入Mock对象的概念。特别是我正在使用Moq框架。但是,我注意到的一件事是,突然间我正在使用此框架测试的类的代码覆盖率显示为0%。

现在我了解到,由于我只是在模拟类,因此它本身没有运行实际的类....但是我该如何编写这些测试并使Code Coverage返回准确的结果呢?我是否需要编写一组使用Mocks的测试以及一组直接实例化该类的测试。

也许我做错了事而没有意识到吗?

以下是我尝试对名为“ MyClass”的类进行单元测试的示例: 通用标签

有人知道我应该做些什么吗?

有帮助吗?

解决方案

您没有正确使用模拟对象。当您使用模拟对象时,您打算测试代码如何与其他对象交互,而无需实际使用实际对象。请参见下面的代码: 通用标签

当您的代码仅返回没有任何逻辑的字符串时,它似乎没有做任何有用的事情。

如果GetSomeString()方法执行了一些逻辑,这些逻辑可能会根据IDependdance .GiveMeAString()方法的返回结果更改输出字符串的结果,那么真正的力量就来了,那么您可以看到您的方法如何处理从IDependdance接口发送的错误数据。

类似的东西: 通用标签

现在,如果您在测试中有此行: 通用标签

您的GetSomeString()方法会发生什么?

其他提示

最大的错误是嘲笑测试中的系统(SUT),您需要测试其他内容。您应该只模拟SUT依赖项。

我建议您远离模拟框架,直到您了解此处正在进行的交互。

IMO最好先学习手动创建的测试对,然后再过渡到模拟框架。我的推理:

  1. 模拟框架将实际发生的事情抽象化了;如果必须显式创建依赖项,然后在调试器中进行测试,则更容易掌握交互。

  2. 容易滥用框架。如果您在学习时自己动手,则更有可能了解不同类型的测试双打之间的区别。如果直接使用模拟框架,则在需要存根时容易使用模拟,反之亦然-两者之间有很大的区别。

    这样想:被测类是重点。您创建它的一个实例,调用它的方法,然后断言结果是正确的。如果要测试的类具有依赖关系(例如,构造函数中需要某些东西),则可以使用A:实型类或B:测试双精度来满足这些依赖关系。

    我们使用test double的原因是它隔离了被测类,这意味着您可以以更加可控的方式执行其代码。

    例如如果您有一个包含网络对象的类,则当您被迫使用一个具体的网络连接对象时,您将无法测试所属类的错误处理例程,这些例程将检测死连接。而是插入一个虚假的连接对象,并告诉它在调用其“ SendBytes”方法时引发异常。

    即在每个测试中,被测试类的依赖关系都是专门为执行特定代码而创建的。

这很有意义。本质上,您是在说我需要执行以下操作: 通用标签

本质上实例化SUT并且仅对SUT所需的类使用模拟吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top