NSubstitute VerifyAll等效

lev*_*nis 5 unit-testing moq mocking nsubstitute

NSubstitute是否有相当于MOQ的VerifyAll电话?我想验证我希望在所有替代品中接收的所有调用实际上都被调用,理想情况是在单个TearDown方法中调用.我目前正在测试中单独验证每个接听的电话,这并不理想.对于初学者来说,如果没有单独明确验证,那么在替代品上设置但实际上没有被调用的任何调用都将通过网络传输.

Iga*_*nik 7

你所描述的是严格模拟的行为.根据定义,严格的模拟只允许您明确配置和期望的内容.这产生了趋于破裂,很多时候,因为你的代码的变化非常脆的测试,因此,如果使用严格的模拟考试都望而却步,而不是新的框架,如NSubstitute或FakeItEasy支持在所有.

我建议简单地为你需要验证的每个方法创建两个测试:一个测试验证某个方法调用,然后是另一个,在同一场景下验证其他方法没有被调用.因此,如果您的逻辑发生更改,并且其中一个方法在应该调用/未调用时,您将只会打破一个测试.

  • "这会产生非常脆弱的测试,往往会经常破坏,因为你的代码会发生变化......"意味着严格的模拟正在完成他们的工作!他们鼓励您简化对象之间的交互,从而提高稳定性.他们通过强调不必要的复杂交互来做到这一点,这会使测试变得脆弱,等等. (4认同)
  • 尊重,我不同意.如果您遵循传统的TDD方式,那么您不必依赖"全能"功能来检测流量何时发生变化,而是添加验证新交互的新测试.例如,如果添加一个新的条件调用,并且之前编写的其中一个测试因此而中断,则可以通过添加新的条件逻辑来修复它.想象一下,在添加一个呼叫后,所有测试都会一直失败.这就是为什么他们被称为脆弱,因为他们可能会在你可能不关心的简单改变之后破裂. (4认同)
  • 我不明白你的评论与我的评论有什么关系.我不像你描述的那样依赖"全能"功能.我经常通过简化生产代码中的交互来修复脆弱的测试,而不是简化模拟.我认为这是严格嘲笑的好处.这是我的观点.至于"遵循传统的TDD方式",我做到了.我帮助普及了"传统的TDD方式".:) (2认同)

Dan*_*rth 5

NSubstitute适用于AAA风格测试,不适用于录制/重播.因此,它不支持它们.

  • @levelnis:精益测试是件好事.但是交际测试更为重要.您认为更好地沟通了什么:`substitute.VerifyAll()`或`substitute.Received.Foo(42)`? (2认同)

Dan*_*enz 5

我知道这已经很老了,我不确定我属于宽松与严格的哪一边,但对于 NSubstitute,您可以通过以下方式实现这一点(xUnit 风格):

Assert.Empty(_logger.ReceivedCalls());
Run Code Online (Sandbox Code Playgroud)

它向您显示特定模拟所收到的所有呼叫,因此您只需确保该数字为 0。这可能是比以前更新的功能,但希望确保它存在!:)