Autofac ILiftetimeScope.ResolveKeyed在单元测试中

时间:2017-08-08 17:50:29

标签: c# unit-testing dependency-injection moq autofac

我最近在使用Unity多年后开始使用Autofac,所以我偶尔遇到一些(新手?)问题。 现在我有以下情况:使用ILifetimeScope.ResolveKeyed返回特定存储库的Factory类,例如:

scope.ResolveKeyed<IDocumentRepository>(EncryptionLevel.None, new NamedParameter("container", "test"))

在我的单元测试中(使用AutoFac.Extras.AutoMock)我有:

using (var mock = AutoMock.GetLoose())
{
    mock.Mock<IDocumentRepository>().Setup(m => m.GetByIdAsync(It.IsAny<Guid>())).Returns(Task.FromResult("hello"));
}

问题出现在单元测试中,它说

  

请求的服务'None(Blob.IDocumentRepository)'尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项。

我试图模仿ILifetimeScope并让它返回我的嘲笑IDocumentRepository,但显然是not possible

那么我该怎样做才能让ILifetimeScope解决我的嘲笑IDocumentRepository

1 个答案:

答案 0 :(得分:1)

您可以将 Mock<T> 注册为 Keyed 到 AutoMock 工厂

var mockToReg = new Mock<IDocumentRepository>();

using (var mock = AutoMock.GetLoose(builder => 
{
    b.RegisterMock(mockToReg ).Keyed<IDocumentRepository>(EncryptionLevel.None);
}))