Есть ли способ протестировать объединение TestServer и moq Mock для замены методов в классах в ConfigureTestServices? - PullRequest
0 голосов
/ 11 января 2019

Я могу выполнять интеграционные тесты, используя TestServer , и я могу вручную смоделировать методы в любом введенном DI-классе, заменив в ConfigureTestServices этот класс на фиктивный, следующим образом:

var webHostBuilder =
    new WebHostBuilder()
        .UseEnvironment("Testing")
        .UseContentRoot(projectDir)
        .ConfigureTestServices(s =>
        {
            s.TryAddTransient(IMyClass, MyMockMyClass);
        })
        .UseStartup<Startup>();

Где MyMockMyClass - это замена MyClass с целью замены метода (например: Method1).

Можно ли использовать moq Mock.Of<MyClass> для быстрой замены на лету моего Method1, без необходимости создавать новый класс MyMockMyClass? Что-то вроде:

var mymock = Mock.Of<IMyClass>();
Mock.Get(mymock ).Setup(m => m.Method1(It.IsAny<string>()).Returns(value: whatever);

А потом каким-то образом использовать это mymock со строкой s.TryAddTransient(IMyClass, ... в коде ConfigureTestServices выше?

Ответы [ 2 ]

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

Пусть фабричный делегат возвращает проверенные сервисы при настройке тестового сервера

var mymock = Mock.Of<IMyClass>();
Mock.Get(mymock)
    .Setup(m => m.Method1(It.IsAny<string>())
    .Returns(value: whatever);

var webHostBuilder =
    new WebHostBuilder()
        .UseEnvironment("Testing")
        .UseContentRoot(projectDir)
        .ConfigureTestServices(services => {
            services.RemoveAll<IMyClass>();//Remove previous registration(s) of this service
            services.TryAddTransient<IMyClass>(sp => mymock);
        })
        .UseStartup<Startup>();

Если вам нужен новый макетированный экземпляр для каждого вызова, переместите логику в делегат фабрики

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

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

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

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

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

...