Mock IServiceCollection.AddSingleton<T>() 方法 in C# Moq



DataConfigstatic类,我想用Moq框架编写一个单元测试用例。

我尝试了以下两件事,但没有成功。

  1. mocmocAddSingleton
  2. 模拟完成ConfigureServices()

我不确定以上哪种方法合适。有人能为测试用例提供一些代码片段吗?

public static class DataConfig
{
public static void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ICompose<int, PlatformRequest>, PlatformRequestComposer>();
services.AddSingleton<IConverter<TerminalGroup, TerminalFacility>,
PlatformResponseComposer>();
services.AddSingleton<IDepartures<int, TerminalFacility>>(
svc =>
{
var reqComp = svc.GetRequiredService<ICompose<int, PlatformRequest>>();
var resComp = svc.GetRequiredService<IConverter<TerminalGroup, TerminalFacility>, 
PlatformResponseComposer>();               
var smsBroker = svc.GetRequiredService<ISmsBroker>();
return new Departures<int,PlatformRequest,TerminalGroup,TerminalFacility>
(requestConverter,responseConverter, smsBroker, "http://some.dummy.url");
});
}
}

我建议使用黑盒测试。与其尝试创建模拟,不如尝试从结果/结果的角度来看待问题:

  • 如果我调用ConfigureServices然后当我试图检索ICompose<int, PlatformRequest>多次然后它返回相同的实例
  • 如果我调用ConfigureServices,那么当我尝试多次检索IConverter<TerminalGroup, TerminalFacility>时,它会返回相同的实例
  • 等。
//Arrange
var collection = new ServiceCollection();
//Act
DataConfig.ConfigureServices(collection);
//Assert
var provider = collection.BuildServiceProvider();
var instance1 = provider.GetService<ICompose<int, PlatformRequest>>();
Assert.NotNull(instance1);
var instance2 = provider.GetService<ICompose<int, PlatformRequest>>();
Assert.NotNull(instance2);
Assert.True(instance1.Equals(instance2)); //If needed use deep equality comparison

最新更新