Эквивалентный синтаксис Moq's Mock.Get в Nsubstitute - PullRequest
1 голос
/ 25 мая 2020

Я пишу модульный тест для фоновой службы. Кажется, это работает, если я использую фреймворк Moq, но мы используем NSubstitute в команде и хотели бы придерживаться этого.

Я имел в виду упомянутый код @ Как мне написать модульный тест для фоновой службы? .

Мне удалось преобразовать синтаксис кода из Moq в NSubstitute за исключением одной строки, т.е. Mock.Get(service).

Может ли кто-нибудь помочь мне преобразовать приведенный ниже код для использования NSubstitute вместо Moq или сообщить мне эквивалентный синтаксис Mock.Get(service) в NSubstitute.

 IServiceCollection services = new ServiceCollection();
 services.AddSingleton(Mock.Of<someobject>()); // Nsubstittute equivalent is services.AddSingleton(Substitute.For<someobject>());

 var serviceProvider = services.BuildServiceProvider();
 var service = serviceProvider.GetRequiredService<someobject>();

 var hostedService = serviceProvider.GetService<IHostedService>();
 await hostedService.StartAsync(CancellationToken.None);
 await Task.Delay(2000);
 await hostedService.StopAsync(CancellationToken.None);

 var mock = Mock.Get(service);
 mock.Verify(_ => _.SendQuote(), Times.Once);

1 Ответ

2 голосов
/ 26 мая 2020

Обычно, поскольку nsub работает напрямую с имитируемым интерфейсом, вы хотите сохранить его в переменной.

//Arrange
IServiceCollection services = new ServiceCollection();    
var mock = Substitute.For<someobject>(); //<-- THE MOCK
services.AddSingleton(mock);
//...add your hosted service that depends on the mock as needed

var serviceProvider = services.BuildServiceProvider();
var hostedService = serviceProvider.GetService<IHostedService>();

//Act
await hostedService.StartAsync(CancellationToken.None);
await Task.Delay(2000);
await hostedService.StopAsync(CancellationToken.None);

//Assert
mock.Received().SendQuote(); //<-- assert the mock directly
...