Тест не провалится при первом запуске - PullRequest
0 голосов
/ 19 мая 2011

У меня есть следующий тест:

[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 ]

1 голос
/ 19 мая 2011

Я изо всех сил пытаюсь понять вопрос здесь ...

Ваша проблема в том, что этот тест проходит с первой попытки? Если да , это означает одну из двух вещей

  • ваш тест содержит ошибку
  • Вы уже выполнили эту спецификацию / требование

Поскольку первое исключено, Грин это. Вы идете к следующему в списке ..

Где-то в дальнейшем, я предполагаю, вы реализуете больше функциональных возможностей, которые приводят к вызову ожидаемого метода. т.е. когда значение состояния отличается, выполните обновление. Исправление для этого теста должно гарантировать, что оба теста пройдены.

Если нет , дайте мне больше информации, чтобы помочь мне понять.

1 голос
/ 20 мая 2011

Следуя методологии TDD, мы пишем только новые тесты для функциональности, которая не существует.Если тест проходит при первом запуске, важно понять, почему.

Одна из моих любимых вещей в TDD - его тонкая способность бросать вызов нашим предположениям и сбивать с толку наше эго.Практика «Вызовы» - это не только отличный способ прохождения тестов, но и большое удовольствие.Мне нравится, когда тест проваливается, когда я ожидаю, что он пройдёт - из этого открывается множество отличных возможностей для обучения;Раз за разом доказательство работоспособности программного обеспечения превосходит эго разработчика.

Когда тест проходит, когда я думаю, что он не должен, следующий шаг должен заставить его провалиться .

Например, ваш тест, который ожидает, что что-то не произойдет , гарантированно пройдет, если реализация закомментирована.Измените логику, которую, по вашему мнению, вы реализуете, закомментировав ее или изменив условия реализации, и убедитесь, что вы получите те же результаты.

Если после этого вы уверены, что функциональностьправильно, напишите другой тест, который доказывает обратное.Будет ли обновление вызываться с другим состоянием или входами?

С обоими наборами вы сможете закомментировать эту функцию и заранее знать, на какой тест будет оказано влияние.(8 шаров, угловой карман)

Я бы также предложил добавить еще одно утверждение в вышеупомянутый тест, чтобы убедиться, что испытуемый объект и функциональность действительно вызываются.

0 голосов
/ 19 мая 2011

измените Times.Never () на Times.AtLeastOnce (), и вы получите хороший старт для tdd.

Попробуйте ничего не найти ни в чем, ну, это хороший тест, но не способ начатьТДД, сначала перейдите с простой спецификацией, наивной операцией, которую пользователь может выполнить (с вашей точки зрения, конечно).

Поскольку вы проделали некоторую работу, сохраните ее на потом, когда она не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...