gui*_*lem 3 c# dependency-injection moq asp.net-core
我很难测试使用 .net 核心ServiceProvider返回特定实现的工厂给定一些逻辑。
using (var scope = _serviceProvider.CreateScope())
{
var services = scope.ServiceProvider.GetServices<IUrlProcessor>();
}
Run Code Online (Sandbox Code Playgroud)
我部分有这个
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(m => m.GetService(typeof(IEnumerable<IUrlProcessor>)))
.Returns(new List<IUrlProcessor>() {
new PassthruProcessor()
});
Run Code Online (Sandbox Code Playgroud)
在GetServices似乎工作,但CreateScope通话刚得来的异常。这是一个扩展方法,我不知道我应该模拟的确切类是什么,以便CreateScope调用正常工作。
Sco*_*nen 11
在这种情况下,创建返回更多模拟的模拟可能无济于事。你的类依赖于IServiceProvider,你需要调用CreateScope().
嘲讽IServiceProvider返回另一个模拟在功能上一样使用真实 ServiceProvider和配置它返回一个模拟。不同之处在于,如果您使用 real ,则您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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
...和一些单元测试代码:
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);
Run Code Online (Sandbox Code Playgroud)
对我来说,这比创建返回更多模拟的模拟更简单、更容易。
| 归档时间: |
|
| 查看次数: |
4280 次 |
| 最近记录: |