Как написать модульный тест в проекте ASP.NET MVC 5?

У меня есть проект, написанный на C# поверх фреймворка ASP.NET MVC 5. Я настроил IoC с использованием Unity-контейнер для обработки инъекций зависимостей.

Мне нужно написать несколько тестовых примеров, чтобы помочь мне протестировать мой проект. Я добавил в свое решение для тестирования новый проект (Unit Test Project (.NET Framework)). В моем первом тестовом классе мне нужно использовать контейнер Ioc для разрешения зависимостей.

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

Как я могу правильно настроить свой тестовый класс, чтобы мои зависимости были инициализированы из контейнера IoC и готовы к тестированию?

Вот мой первый тестовый урок

[TestClass]
public class AnnouncerTests
{
    private static IAnnouncer Accouncer;

    [ClassInitialize]
    public static void SetUp(TestContext context)
    {
        // this does not work
        var container = UnityConfig.GetConfiguredContainer();

        Accouncer = new Announcer(container);
    }

    [TestMethod]
    public void Multiple_Events_Fire_When_Event_Rises()
    {
        var user = new User()
        {
            FirstName = "First Name Test",
            LastName = "Last Name Test"
        };

        Accouncer.Announce(new UserWasCreated(user));
        // Assert .....


    }
}

Как я могу разрешить типы из моего IoC из тестового класса?

Если бы вы использовали реальные объекты (что вы, по-видимому, собирались сделать, поскольку хотели настроить Unity), вы бы тестировали сразу несколько битов своего кода. Это противоречит цели модульного теста. В модульном тесте вы должны точно определить, какой общедоступный метод вы хотите протестировать (известный как System Under Test или SUT). Любые внешние зависимости, которые должны быть высмеяны, не используйте свои реальные реализации. Это изолирует ваш тест, так что вы можете жестко контролировать, что внешние биты делают для вашего теста, поэтому вы можете моделировать ожидаемое и неожиданное поведение, чтобы убедиться, что SUT работает.

mason 18.10.2018 22:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
882
1

Ответы 1

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

Для классов тестирования вы должны имитировать свои зависимости. Существует множество библиотек для имитации и создания тестовых данных: Moq, NSubstitute, Autofixture.

Сообщение о том, как использовать Moq для тестирования контроллера в mvc здесь

Другие вопросы по теме