单元测试IServiceCollection注册

joh*_*y 5 10 c# unit-testing dependency-injection .net-core

我正在试图找出测试我的框架的服务注册方法的最简单方法.我正在创建动态服务,我的注册看起来像这样:

var messageHubConfig = new DynamicHubServiceConfiguration<Message, MessageDTO>();
messageHubConfig.SetDynamicHubOptions<AstootContext>(async (context, dto) =>
{
    return await context.ConversationSubscriptions
                        .Where(x => x.ConversationId == dto.ConversationId 
                               && x.IsSubscribed)
                        .Distinct()
                        .Select(x => x.User.UniqueIdentifier)
                        .ToListAsync();
});

messageHubConfig.RequiresDynamicValidator = false;
messageHubConfig.EventMapping.AddCreateEvent(async (sp, obj, dto) =>
{
    var conversationService = sp.GetService<IRestEzService<Conversation, ConversationDTO>>();
    var conversationDTO = await conversationService.Get(new object[] { dto.ConversationId });
    var hubTaskQueue = sp.GetService<IHubServiceTaskQueue>();
    hubTaskQueue.QueueDynamicCreate(conversationDTO);
}).When(async (sp, dto) => {
    var context = sp.GetService<AstootContext>();
    return await context.Conversations.Where(x => x.Id == dto.ConversationId).Where(x => x.Messages.Count == 1).AnyAsync();
});

//Registers service with a hub
restConfiguration.RegisterRestService(typeof(IMessageDTOService), 
                                      typeof(MessageDTOService), 
                                      messageHubConfig);
Run Code Online (Sandbox Code Playgroud)

我的注册休息服务方法内部我有很多不同的服务注册,例如:

services.AddTransient(restServiceType, (IServiceProvider serviceProvider) =>
{
    var restService = (IRestEzService<TEntity, TDTO>)
        ActivatorUtilities.CreateInstance(serviceProvider, restServiceImplementationType);
    serviceOption.EventMapping?.Register(serviceProvider, restService);

    return restService;
});
Run Code Online (Sandbox Code Playgroud)

如何确保我的工厂配置正确注册,如何创建服务集合进行测试?

Nko*_*osi 24

创建一个ServiceCollection,

var services = new ServiceCollection();
Run Code Online (Sandbox Code Playgroud)

打电话给你的注册功能,然后断言你restServiceType已被添加.

接下来从服务集合构建一个提供者,解决 restServiceType

var provider = services.BuildServiceProvider();
var restService = provider.GetRequiredService(restServiceType);
Run Code Online (Sandbox Code Playgroud)

并断言它是按需创建的.

现在,这完全基于您的示例中当前显示的内容,因为我不知道任何其他依赖项.