Unit testing 使用mock是一种良好的编程实践还是一种不同的方式?
你们会说使用mock比不使用mock好吗? 模拟是仅在单元测试中使用,还是可以作为真实对象直接在原始项目中使用并在之后切换Unit testing 使用mock是一种良好的编程实践还是一种不同的方式?,unit-testing,agile,mocking,Unit Testing,Agile,Mocking,你们会说使用mock比不使用mock好吗? 模拟是仅在单元测试中使用,还是可以作为真实对象直接在原始项目中使用并在之后切换 我到处都在读,我发现模拟最吸引人的地方是层隔离。模拟在单元测试中绝对有用。当您想单独测试依赖于B的A时,您可以模拟B(使用预期的输入/输出)来测试A。您可以确保单独测试B以确保它是正确的 在动态语言中,它们不是严格必需的。但是模拟框架可以帮助您验证您在模拟上设定的期望是否得到满足 您永远不应该使用模拟作为真正的实现。那种事是开玩笑的事。“我们可以模拟整个应用程序!啊啊!”这
我到处都在读,我发现模拟最吸引人的地方是层隔离。模拟在单元测试中绝对有用。当您想单独测试依赖于B的A时,您可以模拟B(使用预期的输入/输出)来测试A。您可以确保单独测试B以确保它是正确的 在动态语言中,它们不是严格必需的。但是模拟框架可以帮助您验证您在模拟上设定的期望是否得到满足
您永远不应该使用模拟作为真正的实现。那种事是开玩笑的事。“我们可以模拟整个应用程序!啊啊!”这就是接口/等价物的用途……最终,可以说这是“另一种方式”。软件已经编写了几十年,并且继续在没有模拟的情况下编写 它主要是一个单元测试工具 模拟/存根真正起作用的是测试驱动的开发。在没有模拟/存根的情况下,人们面临的问题是,应用程序中的依赖关系网通常是这样的,在编写测试之前,您必须构建几乎整个应用程序,甚至在测试更大的功能部分时,隔离bug变得更加困难 考虑以下几点:
- 我想创建
,并编写测试来验证其行为ClassA
- 我开始编写测试(首先进行测试以完成设计)
- 哎呀,
需要从ClassA
获取数据RepositoryM
- 我将实现
,以便测试RepositoryM
ClassA
- 哦,但是首先让我们为
编写测试RepositoryM
- 糟糕,
确实需要RepositoryM
来填充其数据ServiceX
- 我将实现
,这样我就可以测试并实现ServiceX
,这样我就可以测试并实现RepositoryM
ClassA
另一方面,如果“mocking”的意思是“在生产代码中使用mocking框架”,那么不——我不建议这样做,我会手工编写假实现,并且不受依赖性的影响,另外,它更易于推理和调试。模拟的另一个方便之处是,它们的设置速度通常比真实的要快得多(特别是如果说,真实的东西是数据库绑定的),这使得运行测试的速度要快得多。当你说我不应该使用模拟作为真实的实现时,你的意思是我应该只在我想要测试的真实对象之外使用模拟,或者只是我不应该将模拟作为最终产品使用——这显然不是一个好主意。假设我在类a中有一个实方法,它应该调用类B中的实方法,可以在实类a中模拟类B,或者我应该在testclass中测试它并设置实类a和模拟类B@arturo您只能在单元测试的上下文中进行模拟。+1!尽管你可以在开发过程中使用模拟或伪造来允许你在web服务或其他依赖项未完成时演示或UI测试你的应用程序;你不需要