测试在第一次运行时不会失败

时间:2011-05-19 08:41:53

标签: c# unit-testing tdd

我有以下测试:

[Test]
public void VerifyThat_WhenProvidingAServiceOrderWithALinkedAccountGetSerivceProcessWithStatusReasonOfEndOfEntitlementToUpdateStatusAndStopReasonForAccountGetServiceProcessesAndServiceOrders_TheProcessIsUpdatedWithAStatusReasonOfEndOfEntitlement()
{
    IFixture fixture = new Fixture()
                           .Customize(new AutoMoqCustomization());
    Mock<ICrmService> crmService = new Mock<ICrmService>();

    fixture.Inject(crmService);

    var followupHandler = fixture.CreateAnonymous<FollowupForEndOfEntitlementHandler>();
    var accountGetService = fixture.Build<EndOfEntitlementAccountGetService>()
                                   .With(handler => handler.ServiceOrders, new HashedSet<EndOfEntitlementServiceOrder>
                                           {
                                               {
                                                  fixture.Build<EndOfEntitlementServiceOrder>()
                                                         .With(order => order.AccountGetServiceProcess, fixture.Build<EndOfEntitlementAccountGetServiceProcess>()
                                                                                                           .With(process => process.StatusReason, fixture.Build<StatusReason>()
                                                                                                                                                             .With(statusReason=> statusReason.Id == MashlatReasonStatus.Worthiness)
                                                                                                                                                            .CreateAnonymous())
                                                                                                                .CreateAnonymous())
                                                          .CreateAnonymous()
                                               }
                                           })
                                          .CreateAnonymous();
    followupHandler.UpdateStatusAndStopReasonForAccountGetServiceProcessesAndServiceOrders(accountGetService);

    crmService.Verify(svc => svc.Update(It.IsAny<DynamicEntity>()), Times.Never());
}

我的问题是它在第一次运行时永远不会失败,就像TDD指定的那样 应该测试的是,只要服务订单处理的状态存在特定值,就不执行更新 这个测试是否检查它应该是什么?

3 个答案:

答案 0 :(得分:1)

我在这里努力理解这个问题......

这个测试在第一次尝试时是否通过了你的问题? 如果是,则表示两件事之一

  • 您的测试有错误
  • 您已满足此规范/要求

由于第一个已被排除,绿色是。关闭你去列表中的下一个..

在我假设的某个地方,您将实现更多功能,从而导致调用预期的方法。即,当状态值不同时,执行更新。 该测试的修复必须确保两个测试都通过。

如果不是,请向我提供更多信息以帮助我理解。

答案 1 :(得分:1)

遵循TDD方法,我们只为不存在的功能编写新的测试。如果测试在第一次运行时通过,则了解原因非常重要。

关于TDD,我最喜欢的一件事就是它能够挑战我们的假设,并且让我们的自我平稳。 "Calling your Shots"的实践不仅是通过测试的好方法,而且也很有趣。当我希望它能够通过测试失败时我喜欢 - 许多很好的学习机会来自于此;一次又一次,工作软件的证据胜过开发者自我。

当我认为不应该通过测试时,下一步是使其失败

例如,如果实现被注释掉,那么期望不会发生的事情的测试将保证通过。通过注释或改变实施条件来篡改您认为正在实施的逻辑,并验证您是否得到相同的结果。

如果在执行此操作后,您确信功能正确,请编写另一个证明相反的测试。是否会使用不同的状态或输入调用更新?

有了这两个设置,您应该能够注释掉该功能,并且能够提前知道哪个测试会受到影响。 (8球,角落口袋)

我还建议你在上面的测试中添加另一个断言,以确保实际调用被测试的主题和功能。

答案 2 :(得分:0)

将Times.Never()更改为Times.AtLeastOnce()并为tdd提供了良好的开端。

尽量找不到任何东西,这是一个很好的测试,但不是他们开始tdd的方式,首先使用简单的规范,用户可以做的天真操作(当然,从你的观点来看)。

当你完成一些工作时,请在以后失败时保留它。