gpt4 book ai didi

unit-testing - TDD 如何处理模拟对象中的更改

转载 作者:行者123 更新时间:2023-12-03 15:01:51 25 4
gpt4 key购买 nike

在编写单元测试时,对于与单元交互的每个对象,我都采取了以下步骤(从我对 JBrains 的 Integration Tests are a Scam 的理解中窃取):

  • 在单元中编写测试以确保它向协作对象
  • 发送正确的调用和参数
  • 在单元中编写一个测试,以确保它处理来自协作对象的所有可能响应。这些响应都是模拟的,因此该单元是单独测试的。
  • 在协作对象中编写测试以确保它接受调用和参数。
  • 编写测试以确保发送回每个可能的响应。

  • 当我决定重构一个在步骤 2 中模拟了响应的对象时,我的问题就出现了。如果我更改对象响应调用的方式,那么其他对象对该调用的所有测试都不会失败,因为它们都被模拟了以匹配旧样式。您如何使模拟与他们正在模拟的对象保持同步?对此有最佳做法吗?还是我完全误解了事情并且做错了?

    最佳答案

    我这样做。

    假设我必须更改接口(interface)方法 foo() 的响应.我收集了所有 stub 的协作测试 foo()在一个列表中。我收集了方法 foo() 的所有契约(Contract)测试,或者如果我没有契约(Contract)测试,我会收集 foo() 的所有当前实现的所有测试在一个列表中。

    现在我创建一个版本控制分支,因为它会凌乱一段时间。

    @Ignore (JUnit 说话)或以其他方式禁用 stub foo() 的协作测试并开始一一重新实现和重新运行它们。我让他们都过去了。我可以在不触及 foo() 的任何生产实现的情况下做到这一点.

    现在我重新实现实现 foo() 的对象与来自 stub 的新返回值匹配的预期结果一一对应。请记住:协作测试中的 stub 对应于契约(Contract)测试中的预期结果。

    此时,所有协作测试现在都假定来自 foo() 的新响应。并且契约(Contract)测试/实现测试现在期待来自 foo() 的新响应,所以一切都应该正常工作。(TM)

    现在整合你的分支,给自己倒点酒。

    关于unit-testing - TDD 如何处理模拟对象中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574662/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com