Использование фиктивных объектов со словарем - PullRequest
1 голос
/ 10 декабря 2011

Я только начал работать с модульным тестированием с NMock

Один из моих тестовых примеров включает добавление в словарь записи, которая затем передается тестируемому модулю.Я определяю карту как:

var item = new Mock<MyClass>().Object;
var myMap = new Dictionary<MyClass, IList<MyOtherClass>> 
             { 
                { item, completionRequirement }
             };

Однако, когда я делаю myMap.ContainsKey(item) внутри тестируемой единицы, она возвращает false.

Я могу просмотреть прокси-объект в Словаре при его проверке.Я предполагаю, что мне нужно сделать что-то еще и над поддельной item. (Скорее всего, определить .Equals(object o)).

Мой вопрос:

  • Как выопределите Равные (объект o) для смоделированного item.
  • Или существует ли другое решение проблемы в целом.

Ответы [ 3 ]

6 голосов
/ 10 декабря 2011

Возможно, вы захотите издеваться над словарем.То есть рефакторинг должен использовать IDictionary<MyClass,IList<MyOtherClass>, а затем передать в заглушенный словарь.Затем вы можете настроить ожидания так, чтобы при необходимости он возвращал имитированные объекты.

Также возможно, что в этом случае вам вообще может не понадобиться использовать макет.Из того, что вы нам дали, невозможно сказать, но я часто обнаруживал, что люди, плохо знакомые с издевательством, иногда могут забыть, что вы можете использовать и реальные объекты, если эти объекты не имеют каскадных зависимостей.Например, вам не нужно издеваться над классом, который является простым контейнером.Создайте его и используйте вместо этого.Просто о чем подумать.

0 голосов
/ 03 января 2012

Подход, приведенный на http://richardashworth.blogspot.com/2011/12/using-reflection-to-create-mock-objects.html, написан на Java, но представляет другой подход к этой проблеме с использованием Reflection.

0 голосов
/ 10 декабря 2011

Мне нравится идея создания «поддельного» объекта в соответствии с тем, что предлагает tvanfosson.

Но если вы хотите сделать это с помощью насмешливого фреймворка, я думаю, все, что вам нужно сделать, это настроить ожидание того, какой элемент должен быть. Объект должен быть.В Rhino Mocks синтаксис будет выглядеть примерно так:

var knownObject = "myKey";
var mock = MockRepository.GenerateStub<IMyClass>();
mock.Stub(x=>x.Object).Return(knownObject);

Тем не менее, я понятия не имею, каким будет эквивалентный код в NMocks, но это не должно быть трудно понять, если выработа с ним (вы всегда можете задать вопрос по группе пользователей).

HTH

...