Носорог Rhino утверждает, что любой вызов соответствует ожидаемым аргументам - PullRequest
1 голос
/ 06 августа 2011

Я хочу протестировать следующий код:

foreach (CallQueueData queueData in _configurationProvider.CallQueues.Values)
 {
    _chimeManager.AddConfig(new ChimeConfigData(
       ChimeKey.Create(ChimeType.CallQueue, queueData.Name));

    if (queueData.LowChime != null)
    {
       _chimeManager.AddConfig(new ChimeConfigData(
          ChimeKey.Create(ChimeType.QueueLowChime, queueData.Name));
    }

    if (queueData.HighChime != null)
    {
       _chimeManager.AddConfig(new ChimeConfigData(
          ChimeKey.Create(ChimeType.QueueHighChime, queueData.Name));
    }
 }

Один из моих тестов выглядит следующим образом:

public void ShouldAddHighChimeConfigToChimeManager_IfServiceIsStarted_AndHighChimeIsConfigured()
  {
     // GIVEN
     InitializeObjectUnderTestWithougStartingService();

     var callQueueData = new CallQueueData
     {
        Name = "Emergency",
        HighChime = new ChimeType(1, "High")
     };

     CallQueues.Add(callQueueData.Id, callQueueData);

     // WHEN
     _mgr.Startup();

     // THEN
     ChimeManager.AssertWasCalled(x => x.AddConfig(Arg<ChimeConfigData>.Matches(
        y => y.Key == ChimeKey.Create(ChimeType.HighChime, callQueueData.Name))));
  }

Проблема в том, что метод AddConfig в ChimeManager вызываетсянесколько раз, и я не хочу указывать, как часто он должен вызываться, прежде чем он будет соответствовать моему методу.

// i dont like this repeat twice because this ties the test code to much to the production code
ChimeManager.AssertWasCalled(x => x.AddConfig(Arg<ChimeConfigData>.Matches(
        y => y.Key == ChimeKey.Create(ChimeType.HighChime, callQueueData.Name)),
        y => y.Repeat.Twice));

Я бы хотел сказать что-то вроде:

ChimeManager.AssertWasCalled(x => x.AddConfig(Arg<ChimeConfigData>.Matches(
        y => y.Key == ChimeKey.Create(ChimeType.HighChime, callQueueData.Name)),
        y => y.Repeat.Any / y.Match.Any));

Unfortunatley Repeat.Any недопустим в этом случае, любой не существует Match.Any.

Как я могу утверждать, что этот метод вызывался с указанными аргументами, но не должно иметь значения, как часто он вызывается.Когда один из вызовов метода совпадает с указанными аргументами, утверждение не будет завершено.

1 Ответ

2 голосов
/ 06 августа 2011

Вместо написания теста для проверки реализации метода (который со временем становится хрупким), напишите тест для проверки результатов метода. В этом случае, похоже, вы хотите убедиться, что _chimeManager заполнен правильно.

Если вы напишете тест, который просто отправляет некоторые данные, а затем проверяет результаты, ваши юнит-тесты с меньшей вероятностью сломаются со временем. Предположим, что в какой-то момент в будущем заполнение _chimeManager будет происходить через вызовы базы данных или другой метод, отличный от метода Add? Если вы напишете тест на реализацию, ваши тесты будут сломаны. Однако, если вы напишите свой тест, чтобы просто убедиться, что при определенном вводе _chimeManager заполнен правильно, то у вас есть тест, который не будет нарушен при изменении «как».

...