C# Autofac ILiftetimeScope.Resolved键入单元测试
在与Unity合作多年后,我最近开始使用Autofac,因此我不时遇到一些(新手?)问题。。 现在我遇到了以下情况:一个工厂类,它使用C# Autofac ILiftetimeScope.Resolved键入单元测试,c#,unit-testing,dependency-injection,moq,autofac,C#,Unit Testing,Dependency Injection,Moq,Autofac,在与Unity合作多年后,我最近开始使用Autofac,因此我不时遇到一些(新手?)问题。。 现在我遇到了以下情况:一个工厂类,它使用ILifetimeScope.resolvedkeyed返回一个特定的存储库,例如: scope.ResolveKeyed<IDocumentRepository>(EncryptionLevel.None, new NamedParameter("container", "test")) scope.ResolveKeyed(EncryptionL
ILifetimeScope.resolvedkeyed
返回一个特定的存储库,例如:
scope.ResolveKeyed<IDocumentRepository>(EncryptionLevel.None, new NamedParameter("container", "test"))
scope.ResolveKeyed(EncryptionLevel.None,新名称参数(“容器”、“测试”))
在我的单元测试(使用AutoFac.Extras.AutoMock)中,我有:
使用(var mock=AutoMock.GetLoose())
{
mock.mock().Setup(m=>m.GetByIdAsync(It.IsAny()).Returns(Task.FromResult(“hello”));
}
它说,问题发生在单元测试中
请求的服务“无(Blob.IDocumentRepository)”尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项
我试图模拟ILifetimeScope
,让它返回我模拟的IDocumentRepository
,但显然是这样
那么,我该怎么做才能使ILifetimeScope解析我的模拟
IdocumentResposition
?您可以将模拟
注册为键控
var mockToReg = new Mock<IDocumentRepository>();
using (var mock = AutoMock.GetLoose(builder =>
{
b.RegisterMock(mockToReg ).Keyed<IDocumentRepository>(EncryptionLevel.None);
}))
var mockToReg=new Mock();
使用(var mock=AutoMock.GetLoose)(builder=>
{
b、 注册表锁(mockToReg).Keyed(EncryptionLevel.None);
}))
直接使用ILifetimeScope
可以被视为某种服务定位器反模式,但有时(很少)需要。你确定你一定要用它吗?也许您可以插入IIndex
(请参阅)?它很容易被嘲笑…@tdragon我尝试了IIndex,但我还需要提供一些构造函数参数(现在将其添加到问题中)。这也可以实现吗?所有的IDocumentRepository
实现都需要此自定义参数,还是只需要一个注册了keyEncryptionLevel的参数。没有一个?有一大堆存储库将具有相同的密钥,但使用不同的存储位置(“容器”参数),因此,我需要一种向repository提供该信息的方法。如果所有repositories都需要string container
参数,则可以插入IIndex IIndex
,然后使用IIndex[EncryptionLevel.None](“name”)
创建新的repositories
var mockToReg = new Mock<IDocumentRepository>();
using (var mock = AutoMock.GetLoose(builder =>
{
b.RegisterMock(mockToReg ).Keyed<IDocumentRepository>(EncryptionLevel.None);
}))