различные макетные объекты для сравнения объектов в модульных тестах

#c# #.net #xunit.net #xunit

#c# #.net #xunit.net #xunit

Вопрос:

У меня есть метод Equals, который я пытаюсь протестировать. этот метод возвращает true, если объект, переданный is, совпадает с этим объектом.

Я проверяю условие true следующим образом.

         var mocks = new MockRepository();
        var mockActionAlert = mocks.StrictMock<ActionAlert>();
        var mockActionAlert2 = mocks.StrictMock<ActionAlert>();
        bool comparer = mockActionAlert.Equals(mockActionAlert2);
        Assert.Equal(true, comparer);
  

Однако, как я могу получить другой макет объекта для проверки того, что метод equal возвращает false .

Спасибо,

Ответ №1:

То, что вы показали, похоже, вообще не имеет никакого смысла.

В вашем тестовом коде есть только макеты — вообще никаких реальных реализаций.

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

Чтобы сделать то, что (я думаю) вы хотите, просто создайте ActionAlert (один из вашего реального кода, а не макет одного), а затем создайте второй ActionAlert со свойствами, которые должны сделать его равным, используя ваш метод Equals. Передайте второй ActionAlert и подтвердите, что результат верен (вероятно, лучше всего использовать Assert.True(), поскольку это более выразительно для намерения).

Затем при проверке того, что метод Equals возвращает false , напишите тесты с ActionAlerts со свойствами, которые делают их не равными. Нет необходимости в макетах вообще.

Место, где вам нужны макеты, — это то, где у вас есть зависимости в ваших тестируемых классах, от которых вы хотите либо подтвердить определенное поведение (был ли метод зависимости вызван определенным образом), либо вы хотите получить некоторое предопределенное поведение (заставить метод возвращать определенное значение при вызове).

Комментарии:

1. Ааа, хорошо, это имеет смысл. Позвольте мне попробовать это. Большое спасибо 🙂

2. да, это делает это 🙂 Мне действительно следует вернуться и изменить все мои тесты. Я действительно не знал, когда использовать макетные объекты, и постоянно издевался. Спасибо, что потратили время на объяснение этого.

3. @socialMatrix Рад, что смог быть полезен — взгляните на эту статью martinfowler.com/articles/mocksArentStubs.html это одна из самых полезных статей, написанных о макетах Мартином Фаулером, который является одним из настоящих гуру. Кроме того, в используемой вами макетной платформе, безусловно, будут примеры, которые помогут вам получить максимальную отдачу от использования mocks. Я помню, когда я впервые обнаружил mocking, это полностью изменило мои представления о тестировании кода.