Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac ILiftetimeScope.Resolved键入单元测试_C#_Unit Testing_Dependency Injection_Moq_Autofac - Fatal编程技术网

C# Autofac ILiftetimeScope.Resolved键入单元测试

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

在与Unity合作多年后,我最近开始使用Autofac,因此我不时遇到一些(新手?)问题。。 现在我遇到了以下情况:一个工厂类,它使用
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
实现都需要此自定义参数,还是只需要一个注册了key
EncryptionLevel的参数。没有一个
?有一大堆存储库将具有相同的密钥,但使用不同的存储位置(“容器”参数),因此,我需要一种向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);
}))