c# - 在为单元测试创​​建模拟时,我们是否在自欺欺人?

标签 c# unit-testing mocking nsubstitute

从昨天开始,我才刚刚开始学习所有关于单元测试的知识,今天正在阅读有关 Mocks 和 NSub 的内容。 我的问题是我不明白它背后的哲学和思维方式。因此,例如阅读我的书是这样的:

[Test]
public void Returns_ByDefault_WorksForHardCodedArgument()
{
IFileNameRules fakeRules = Substitute.For<IFileNameRules>();

fakeRules.IsValidLogFileName(Arg.Any<String>())
.Returns(true);

Assert.IsTrue(fakeRules.IsValidLogFileName("anything.txt"));

}

好的,所以首先我们创建一个假对象来表示实际类的接口(interface),我们在其中有一个实际的方法来做一些实际的工作。然后我们调用该方法,但我们也告诉它返回 true。 然后我们断言它看它是否返回 true ?好吧,我们只是在返回 true 之前告诉它一行!现在我们测试它是否返回真值!他们我们说好的好过去了吗? 我不明白!对我来说是这样的感觉:老师告诉 child 为了通过考试,如果被问到这个问题,就回答是,然后去问那个问题, child 说是,考试就通过了?

最佳答案

根据对这个问题的评论,这个测试很可能展示了 mocking 库是如何工作的。对于我们的测试代码,我们极不可能(部分模拟是一个潜在的异常(exception))模拟出我们想要测试的类。相反,我们可能想要模拟代码使用的一些东西,以便获得更多确定性测试、更快的测试或模拟罕见事件的测试等。

对于您的直接问题,是的,我想当我们为测试模拟依赖项时,我们有点在自欺欺人。我们在说“让我们假装我们的依赖做 X,然后检查我们的代码做 Y”。现在有可能依赖项实际上从未执行过“X”。对我来说, mock 的目的是从这个虚构开始,然后测试我们的依赖性并确保它确实做了“X”,直到虚构最终与现实相符。

关于c# - 在为单元测试创​​建模拟时,我们是否在自欺欺人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816799/

相关文章:

c# - 如何在 LINQ 中将一个对象的所有属性复制到另一个对象

ios - OCMock - 验证方法调用的顺序。还有别的办法吗?

java - 返回类型为 Message<?> 的 Spring Integration Activator 的 JUnit

unit-testing - EasyMock:模拟对象正在调用实际方法

c# - 如何测试事件触发

.Net - 模拟和混淆

c# - 了解 .NET 程序集签名

c# - Service Fabric 未处理的异常和最佳实践

c# - 如何获取和更改 Windows 凭据用户名和密码

c++ - 您如何在大型 C++ 项目中实现单元测试?