gpt4 book ai didi

c# - 模拟服务提供者 GetServices

转载 作者:太空宇宙 更新时间:2023-11-03 20:51:25 25 4
gpt4 key购买 nike

我很难测试使用 .net 核心 ServiceProvider 返回给定一些逻辑的特定实现的工厂。

using (var scope = _serviceProvider.CreateScope())
{
var services = scope.ServiceProvider.GetServices<IUrlProcessor>();
}

我部分接受了这个

var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(m => m.GetService(typeof(IEnumerable<IUrlProcessor>)))
.Returns(new List<IUrlProcessor>() {
new PassthruProcessor()
});

GetServices 似乎有效,但 CreateScope 调用只是通过异常。这是一个扩展方法,我不知道我应该模拟的确切类是什么,以便 CreateScope 调用有效。

最佳答案

在这种情况下,创建返回更多模拟的模拟可能无济于事。您的类依赖于 IServiceProvider,您需要调用 CreateScope()

模拟 IServiceProvider 以返回另一个模拟在功能上与使用 真实 ServiceProvider 并将其配置为返回模拟在功能上相同。不同之处在于,如果您使用真正的 ServiceProvider,则不必模拟 CreateScope

(我完全回避了有关何时何地依赖 IServiceProvider. 的问题)

这是一个大大简化的例子:

依赖于 IServiceProvider 的类:

public class ScopedFooFactory : IFooFactory
{
private readonly IServiceProvider _serviceProvider;

public ScopedFooFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}

public IFoo CreateFoo()
{
using (var scope = _serviceProvider.CreateScope())
{
return scope.ServiceProvider.GetService<IFoo>();
}
}
}

...和一些单元测试代码:

var serviceCollection = new ServiceCollection();
var fooMock = new Mock<IFoo>();
serviceCollection.AddScoped<IFoo>(provider => fooMock.Object);
var serviceProvider = serviceCollection.BuildServiceProvider();
var subject = new ScopedFooFactory(serviceProvider);
var foo = subject.CreateFoo();
Assert.AreSame(fooMock.Object, foo);

对我来说,这比创建返回更多模拟的模拟更简单、更容易。

关于c# - 模拟服务提供者 GetServices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54832377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com