我需要使用特定的界面注册我的Autofac容器,对于这种情况,我想解决mock。
我该怎么做?
我试过了:
var AppContainer = ApplicationContainer.GetApplicationContainer();
var cb = new ContainerBuilder();
cb.RegisterType<Mock<IStudyLoader>>().As<IStudyLoader>().SingleInstance();
cb.Update(AppContainer);
我不想更改我的代码以解决除IStudyLoader
以外的其他问题,但Mock<IStudyLoader>
不能代替IStudyLoader
;例如Mock<IStudyLoader>.Object
可替代IStudyLoader
,但我无法注册Mock<IStudyLoader>.Object
,因为它不是类型。
请纠正我;我觉得我错过了什么。
(我有另一个限制,我不能使用除ApplicationContainer.GetApplicationContainer()
之外的其他容器)
(我认为在测试时手动注入依赖项会更好,但这次我不想更改生产代码。)
答案 0 :(得分:17)
我找到了解决方案,是的,这是可能的!
var AppContainer = ApplicationContainer.GetApplicationContainer();
var studyLoaderMock = new Mock<IStudyLoader>().Object;
cb.RegisterInstance(studyLoaderMock).As<IStudyLoader>();
cb.Update(AppContainer);
答案 1 :(得分:7)
您要查找的方法称为RegisterInstance
:
var mock = ...;
var cb = new ContainerBuilder();
cb.RegisterInstance(mock.Object);
var container = cb.Build();
也就是说,现有的容器(在您的情况下是AppContainer)已经注册了您要模拟的界面无法解析实例。它将继续解决生产实例。
我强烈建议您遵循的“解决方法”是不要让AppContainer参与您的测试,而是为您的测试构建一个容器,以便您可以更好地控制其中的内容。结果是你可以注册所需的任何模拟实例以及SUT。
答案 2 :(得分:4)
旧问题,但AutoFac现在自版本4.0.1支持Moq4并提供额外的软件包,您可以安装Autofac.Extras.Moq
function htmlspecialchars_array($data) {
$data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
return $data;
}
function sanitize_array($data) {
$data = array_map('trim', $data);
$data = array_map('strip_tags', $data);
$data = array_map('htmlspecialchars_array', $data);
return $data;
}
while ($row = $result->fetch_assoc()) {
array_push($header, sanitize_array($row)); // Push rows to array
}
Autofac.Extras.Moq自动安装AutoFac和Moq
您无需创建Container并注册StudyLoader。它由Autofac.Extras.Moq。
隐式定义Autofac.Extras.Moq对于嵌套依赖项很有价值。您无需注册所有依赖关系图。只模拟你的SystemUnderTest SUT对象
您可以按照以下规定实施测试用例:
Install-Package Autofac.Extras.Moq
答案 3 :(得分:1)
我没有使用autofac的特殊经验,但我使用的大多数其他容器都允许注册已经创建的对象实例。因此,您可以创建模拟,然后将mock.Object注册为IStudyLoader的实现。请参阅autofac文档,了解如何执行此操作。
答案 4 :(得分:0)
由于此问题已被提出,现在有一个1780, 1781, 1782
包,由AutoFac支持:
http://autofaccn.readthedocs.io/en/latest/integration/moq.html
这允许您在单元测试中创建动态依赖项。