Nsubstitute 中 Moq 的 Mock.Get 的等效语法

Equivalent syntax of Moq's Mock.Get in Nsubstitute

我正在为后台服务编写单元测试。如果我使用 Moq 框架似乎可行,但我们在团队中使用 NSubstitute 并希望坚持使用它。

我指的是 @How can i write unit test for my background service? 提到的代码。

我设法将代码语法从 Moq 转换为 NSubstitute,除了一行,即 Mock.Get(service)

谁能帮我将下面的代码转换为使用 NSubstitute 而不是 Moq,或者让我知道 NSubstitute 中 Mock.Get(service) 的等效语法。

 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);

通常,由于 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