Rhino Mocks: как сопоставить аргументы массива в ожидании?

Снова на Rhino Mocks Noob Wall

mockUI.Expect( x => x.Update( new Frame[] {Frame.MakeIncompleteFrame(1, 5)} ) );

Это именно тот аргумент, который мне нужно сопоставить. С помощью операторов трассировки я убедился, что это также фактический результат, т. е. код ведет себя так, как предполагалось, но тест не согласен. RhinoMocks отвечает

TestBowlingScorer.TestGamePresenter.TestStart:
Rhino.Mocks.Exceptions.ExpectationViolationException : IScoreObserver.Update([Frame# 1, Score =  0 Rolls [  5,  PENDING,  ]]); Expected #1, Actual #0.

Объект Frame содержит несколько свойств, но пока не переопределяет Equals() (переопределение ToString() показано выше). Обновление получает массив фреймов; Как настроить это ожидание? Я вижу ограничение Is.Matching... не знаю, как его использовать, или, скорее, меня беспокоит его многословный характер.

У меня есть вспомогательный пользовательский Assert в стиле NUnit.

public static void AssertFramesAreEqual(Frame[] expectedFrames, Frame[] actualFrames)
{
  // loop over both collections
     // compare attributes
}

person Gishu    schedule 15.09.2009    source источник


Ответы (2)


@Gishu, да, вот так. Я только что узнал о статическом классе Arg‹>, который позволит вам сделать что-то вроде этого:

mockUI.Expect( x => x.Update(Arg<Frame[]>
           .Matches(fs=>HelperPredicates.CheckFrames ( expected, fs)) ));

Существует также отправная точка конфигурации Arg‹>.List, которую я еще не исследовал, но может быть даже лучше для того, что вы хотите.

person George Mauer    schedule 16.09.2009
comment
Работает, если параметр представляет собой List<T>, где T представляет собой структуру типа mockUI.Update(Arg<List<Frame>>.List.ContainsAll(list_of_expected_frames));. Не работает для моего случая Frame[], где Frame — это класс, который не переопределяет Equals() — не тратил на это слишком много времени. - person Gishu; 29.09.2009

Проверенные работы.. не знаю, подходит ли это RhinoMocks

var expectedFrames = new Frame[] { Frame.MakeIncompleteFrame(1, 5) };
mockUI.Expect( x => x.Update(null) )
            .IgnoreArguments()
            .Constraints( Is.Matching<Frame[]>( frames => HelperPredicates.CheckFramesMatch(expectedFrames, frames) ) );

Вспомогательный предикат — это просто функция, которая возвращает логическое значение — True при точном совпадении, иначе false.

 public static bool CheckFramesMatch(Frame[] expectedFrames, Frame[] actualFrames)
  {
     // return false if array lengths differ
     // loop over corresponding elements
          // return false if any attribute differs
     // return true
  }
person Gishu    schedule 16.09.2009