У меня есть проект, написанный на 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 из тестового класса?





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