2012-03-02 1 views
0

Я видел несколько примеров того, как настроить единый тестовый класс для ASP.NET MVC 3 с использованием Ninject и Moq, но они все это связано с созданием ложного хранилища внутри тестового класса.ASP.NET MVC 3, Ninject, Moq: экземпляр mock-репозитория вне класса модульного тестирования

Что я хотел бы сделать, это построить ложный репозиторий при запуске или загрузке приложения - так, возможно, в Global.asax.cs - и передать это вместо моего тестового класса. Таким образом, я могу перейти в репозиторий состояния сеанса или репозиторий базы данных в моем методе Ninject AllBindings() без необходимости менять класс тестирования модуля. У меня уже есть это в запуске приложения:

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

Я даже могу понять, поставив команду Bind в Global.asax.cs, но как бы это получить прошло в тестовом классе? Когда вы выберете Test> Run, он даже пройдет через global.asax.cs? Наверное, я не уверен, какой контекст, если таковой имеется, вызывает тестовый класс. Я не могу окунуться в голову, как это сделать, и я не видел примеров, связанных с созданием репозитория, а затем передачи его в тестовый класс.

Возможно ли, и если да, как это можно сделать? Заранее благодарю за любой совет!

ответ

3

То, что я хотел бы сделать, это построить макет хранилища на старте приложения или нагрузки - так, возможно, в Global.asax.cs - и передать это мой тестовый класс вместо этого.

Erm, подождите, я думаю, что вам не хватает всего элемента модульного тестирования. Единичный тест находится в отдельном проекте, который не связан с запущенным приложением ASP.NET. Global.asax используется только приложением ASP.NET.

В вашем модульном тесте вы должны изолировать отдельные классы вашей системы, не полагаясь на какие-либо конкретные классы ASP.NET. И если эти классы зависят от некоторых других уровней, таких как, например, контроллер в зависимости от репозитория или уровня сервиса, вы можете использовать фреймворк для определения ожиданий этой зависимости для тестирования изолированного контроллера. Это работает только в том случае, если зависимость выражается через интерфейс или абстрактный класс, который можно высмеять.

+0

Ah! Теперь, когда я обманываю голову. Спасибо за разъяснение! –

1

Вместо использования Global.asax (по причинам, отмеченным Дарином Димитрием) вы можете создать либо базовый класс для своего теста, либо класс утилиты tetst. Или вы можете просто отказаться от NInject для теста и выполнить инъекцию зависимости вручную в своих тестах. Я бы предпочел использовать ручной подход для большинства тестов.

Сказав это; если вы решите создать базовый класс для своих тестов, вы можете сделать все свои установки NInjects, а затем у вас наследуйте свои тестовые классы. Таким образом, ваша тестовая установка NInject запускается перед каждым тестом. Используя Xunit.NET, это будет идти по строкам:

public class TestBase 
{ 
    public TestBase() 
    { 
     // Ninject setup for tests 
    } 
} 

public class ATestClass : TestBase 
{ 
    [Fact] 
    public void ATestCase() 
    { 
     // do your test using the test Ninject setup 
    } 
} 
Смежные вопросы