ASP.NET MVC 3, Ninject, Moq: создание экземпляра ложного репозитория вне класса модульного тестирования - PullRequest
0 голосов
/ 02 марта 2012

Я видел несколько примеров того, как настроить класс модульного тестирования для 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? Я думаю, я не уверен, какой контекст, если таковой имеется, вызывает тестовый класс. Я не могу понять, как это сделать, и я не видел ни одного примера, который бы сначала создавал хранилище, а затем передавал его в тестовый класс.

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

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

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

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

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

1 голос
/ 02 марта 2012

Вместо использования 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
    }
}
...