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

C# 测试在第一次运行时不会失败,c#,unit-testing,tdd,C#,Unit Testing,Tdd,我有以下测试: [Test] public void VerifyThat_WhenProvidingAServiceOrderWithALinkedAccountGetSerivceProcessWithStatusReasonOfEndOfEntitlementToUpdateStatusAndStopReasonForAccountGetServiceProcessesAndServiceOrders_TheProcessIsUpdatedWithAStatusReasonOfEndOfE

我有以下测试:

[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());
}
[测试]
public void验证当使用AlinkedAccountGetSerivceProcesss提供服务订单时,AccountGetServicesProcesses和ServiceOrders的Status ReasonofEndofentitlementUpdateStatus和Stop Reasons是否使用Atus ReasonofEndofentitlement()更新该流程
{
IFixture fixture=新夹具()
.自定义(新的AutoMoqCustomization());
Mock crmService=新建Mock();
夹具注入(crmService);
var followupHandler=fixture.CreateAnonymous();
var accountGetService=fixture.Build()
.With(handler=>handler.ServiceOrders,新HashedSet
{
{
fixture.Build()
.With(order=>order.AccountGetServiceProcess,fixture.Build()
.With(process=>process.StatusReason,fixture.Build()
.With(statusReason=>statusReason.Id==MashlatReasonStatus.vourity)
.CreateAnonymous())
.CreateAnonymous())
.CreateAnonymous()
}
})
.CreateAnonymous();
AccountGetServiceProcesses和ServiceOrders(accountGetService)的UpdateStatus和StopReasons;
crmService.Verify(svc=>svc.Update(It.IsAny()),Times.Never());
}

我的问题是它在第一次运行时永远不会失败,就像TDD指定的那样。
它应该测试的是,每当服务订单流程的状态有某个值时,不执行更新。
此测试是否正在检查它应该检查的内容?

将Times.Never()更改为Times.atlestOnce(),这样tdd就有了一个良好的开端

试着什么都找不到,这是一个很好的测试,但这不是启动tdd的方法,首先使用简单的规范,用户可以做的简单操作(当然,从您的角度来看)


当你做了一些工作后,把它留到以后,当它失败时。

我正在努力理解这里的问题

你的问题是第一次测试通过了吗? 如果是,则表示两件事之一

  • 你的测试有错误
  • 您已满足此规范/要求
因为第一个已经被排除,所以它是绿色的。你去名单上的下一个

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


如果没有,请提供更多信息帮助我理解。

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

关于TDD,我最喜欢的一件事是它的微妙能力,挑战我们的假设,打击我们的自尊心。练习考试不仅是通过考试的好方法,而且也很有趣。我喜欢当考试失败时,当我期望它通过时——许多伟大的学习机会来自于此;一次又一次,软件运行的证据胜过了开发人员的自我

当一个测试在我认为不应该的情况下通过时,下一步就是让它失败

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

如果完成此操作后,并且您确信功能是正确的,请编写另一个测试来证明相反的结果。是否会使用不同的状态或输入调用Update

有了这两个集合,您应该能够注释掉该特性,并且能够提前知道哪个测试将受到影响。(8-球,角袋)


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

我的问题是它在第一次运行时永远不会失败,就像TDD指定它应该失败一样。=>依我看,你误解了TDD@the_drow:你不担心那宽大的缩进吗?这不是我所说的易于阅读或理解的…@MitchWheat:我在这里尽了最大努力,但stackoverflow编辑器不是代码编辑器。在visual studio中,它非常可读。@Vimvq1987:是否要详细说明原因?第一次运行失败,因为您没有实现它的工作代码。编写工作代码后,它应该始终通过。据我所知,你希望它在每次第一次跑步中都会失败,而不是传球,对吗?但在这种情况下不应该叫它。当然,我不会叫它“它”,我会叫它“她”,怎么了?这里。好的,在这个测试用例中,对函数的调用应该是no-op,在其他任何情况下,它都应该调用Update()。所以这是一个例外,因为测试必须在第一次运行时失败?@the_-drow-Yes。在大多数情况下,测试都会失败。这里有一些来自JUnit食谱作者的支持性证据——这不违反AAA吗?每个测试应该有一个断言。@t