使用moq的autofac

时间:2011-11-09 07:49:19

标签: c# moq autofac

我需要使用特定的界面注册我的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()之外的其他容器)

(我认为在测试时手动注入依赖项会更好,但这次我不想更改生产代码。)

5 个答案:

答案 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

这允许您在单元测试中创建动态依赖项。