2009-07-14 2 views
1

У меня есть PresenterFactory, который создает классы Presenter на основе параметра Role. В частности, параметр Роль представляет собой внешний класс, который я не могу контролироватьНадлежащее применение Mock-объектов в модульном тестировании

Моя фабрика выглядит примерно так (IE 3 участника.):

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:

Invalid установка на не переопределение члена: роль => role.IsUserA ("Менеджер")

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

ответ

2

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

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

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

0

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

+0

Вот что я пытался, но получил * Неверная настройка для члена, не являющегося переопределяемым * исключение –

+0

В этом случае я рекомендую ответ womp написать класс оболочки вокруг объекта Role. –

0

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

+1

Дорогие решения;) – womp

0

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

Смежные вопросы