Присвоенный объекту значение true обрабатывается как ложный - PullRequest
0 голосов
/ 12 июля 2011

У меня есть модульный тест (с использованием typemock 5.4.5.0), который тестирует службу создания.Служба создания передается в службу проверки в своем конструкторе.Служба проверки возвращает объект с логическим свойством (IsValid).В моем модульном тесте я проверяю вызов службы проверки, чтобы вернуть экземпляр, для которого IsValid имеет значение true.У службы создания есть оператор if, который проверяет значение этого свойства.Когда я запускаю модульный тест, объекту, возвращенному из службы проверки, присваивается свойство true, но при выполнении оператора if он обрабатывается так, как если бы он был ложным.

Я могу проверить это путем отладкимодульный тест.Объект, возвращенный службой валидации, действительно имеет свойство IsValid, установленное в значение true, но полностью пропускает оператор my if и переходит к концу If.

Вот ссылка на сам модульный тест -https://gist.github.com/1076372

Вот ссылка на функцию создания, которую я тестирую - https://gist.github.com/1076376

Кто-нибудь знает, почему, черт возьми, свойство IsValid является истинным, но рассматривается как ложное?

PS Я также столкнулся с этой проблемой в системе поддержки TypeMock, но, думаю, здесь я получу более быстрый ответ!

1 Ответ

0 голосов
/ 09 августа 2011

Во-первых, если возможно, я бы порекомендовал перейти на последнюю версию Typemock Isolator, на которую у вас есть лицензия.Каждая выходящая версия, даже незначительные версии, содержит исправления для интересных крайних случаев, которые иногда заставляют вещи работать по-другому.Я обнаружил, что обновление иногда исправляет некоторые вещи.

Далее, я вижу эту строку в вашем модульном тесте:

Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(new QuestionViewModel())).WillReturn(new Validation(true));

Красный флаг для меня - это "new QuestionViewModel ()", который находится внутриблок «WhenCalled ()».

Два хороших эмпирических правила, которым я всегда следую:

  1. Не помещайте в WhenCalled () ничего, что не нужно подвергать насмешкам.
  2. Если вас не интересуют аргументы, не передавайте реальные аргументы.

В этом случае первое правило заставляет меня думать: «Мне не нужен конструктордля насмешки QuestionViewModel, поэтому я не должен вставлять его туда. "

Второе правило заставляет меня задуматься, действительно ли аргумент метода" ValidateNewQuestionForExistingPool "не важен.В этом случае это не так, поэтому я бы пропустил null, а не реальный объект.Если есть какая-то перегрузка, на которую вы специально обращаете внимание, сначала приведите значение NULL.

Наконец, в некотором роде, исходя из этого первого правила, я обычно стараюсь не указывать свои возвращаемые значения.Это означает, что я бы создал новый объект Validation перед вызовом Isolate.

var validation = new Validator(true);
Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(null)).WillReturn(validation);

Попробуйте, посмотрите, как он работает.Вы также можете посмотреть в утилите Typemock Tracer, чтобы увидеть, что настраивается с ожиданием, когда вы запускаете тест, чтобы убедиться, что не устанавливаются дополнительные ожидания, что вы не ... ожидаете .

...