Объявление конструктора внутри Controller, наследующего ControllerBase - PullRequest
1 голос
/ 11 апреля 2019

Я работаю над проектом веб-приложения, использующего ASP.NET Core 2.1. Наряду с разработкой API мы также пытаемся протестировать его с использованием инфраструктуры MSTest.

Мои контроллеры наследуются от ControllerBase. В своем тестовом стенде я высмеиваю свой бизнес-уровень с помощью Moq Framework. Когда я вызываю Controller из метода test, мне нужно передать экземпляр Mocked Business в контроллер, для которого я пытаюсь объявить параметризованный конструктор.

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

Это прекрасно работает с Dot Framework, который наследует APIController.

public class BookingController: ControllerBase {
    BusinessManager business = new BusinessManager();
    //Non-Parameterized Constructor
    public BookingController() {}
    //Parameterized Constructor
    public BookingController(BusinessManager mockedBusiness) {
        this.business = mockedBusiness;
    }
}

Не параметризованный конструктор должен использоваться при вызове из пользовательского интерфейса. Параметризация должна работать только при вызове из Test Bench, передавая некоторый экземпляр.

1 Ответ

0 голосов
/ 11 апреля 2019

В исходном коде

BusinessManager business = new BusinessManager();

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

Используйте принцип явной зависимости и оставьте параметризованный конструктор

public class BookingController: ControllerBase {
    private readonly BusinessManager business;

    //Parameterized Constructor
    public BookingController(BusinessManager business) {
        this.business = business;
    }

    //...
}

В Startup зарегистрируйте свою зависимость с набором сервисов

public void ConfigureServices(IServiceCollection services) {

    //...

    services.AddScoped<BusinessManager>();

    //...

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...