Правильное применение объектов Mock в модульном тестировании - PullRequest
1 голос
/ 15 июля 2009

У меня есть PresenterFactory, которая создает классы Presenter на основе параметра Role. В частности, параметр Role является внешним классом, который я не могу контролировать (IE Сторонний.)

Моя фабрика выглядит примерно так:

public class PresenterFactory {
    public Presenter CreatePresenter(Role role, ...) {
        if (role.IsUserA("Manager")) {
            return new ManagerPresenter(...)
        }
        if (role.IsUserA("Employee")) {
            return new EmployeePresenter(...)
        }
    }
}

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

public void TestPresenterFactory()
{
    var mockRole = new Mock<Role>();

    mockRole .Setup(role=> role.IsUserA("Manager"))
        .Returns(true)
        .AtMostOnce();

    PresenterFactory.CreatePresenter(mockRole.Object, ...);

    mockUserInfo.VerifyAll();
}

Однако я получаю ArguementException:

Неверная настройка для не перезаписываемого члена: role => role.IsUserA ("Manager")

Я не уверен, куда идти, и уверен, что мог бы использовать некоторую коррекцию курса. Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 15 июля 2009

Вы можете создать объект-оболочку для Роли, который имеет все те же методы и свойства, но является надёжным, и реализация по умолчанию просто возвращает базовую реализацию Роли.

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

Это часто способ обойти конкретные классы, которые действительно нуждаются в насмешках.

0 голосов
/ 15 июля 2009

В Java при использовании расширений EasyMock вы могли бы имитировать "реальные" объекты и методы, скорее всего, есть эквивалентная или альтернативная среда моделирования, которую вы можете использовать для своих целей

0 голосов
/ 15 июля 2009

Подумайте об использовании моделирующей среды, которая не накладывает искусственных ограничений (таких как требования к виртуальным методам, классам, которые не должны быть запечатаны, и т. Д.) На то, как ваш код должен быть написан для того, чтобы быть поддельным. Единственный пример такого, о котором я знаю в контексте .NET, это TypeMock.

0 голосов
/ 15 июля 2009

То, что вы хотите смоделировать, - это создание объекта Role, а затем передать этот ложный объект в ваш метод CreatePresenter. На макете вы бы установили все необходимые свойства, чтобы определить, какой это тип пользователя. Если на данный момент у вас все еще есть зависимости от базы данных, вы можете взглянуть на рефакторинг вашего объекта Role.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...