AutoConfiguredMoqCustomization和不可设置的属性

时间:2015-08-18 08:48:45

标签: moq autofixture

如何强制使用AutoConfiguredMoqCustomization配置的AutoFixture自动模拟接口及其只读属性?

为了清楚说明,我们假设我有这样的界面:

public interface A {
     int Property {get;}
}

和这样的课程:

public class SomeClass {
     public SomeClass(A dependency) {}
}

我想要的是让dependency解析为将在dependency.Property中返回内容的模拟:

var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
var sut = fixture.Create<SomeClass>(); // <- dependency passed to SomeClass' constructor will have .Property returning null

1 个答案:

答案 0 :(得分:5)

这是由于Moq 4.2.1502.911中引入了一个错误,其中SetupAllProperties会覆盖以前在get-only属性上完成的设置。

这是一个更简单的复制品:

public interface Interface
{
    string Property { get; }
}

var a = new Mock<Interface>();

a.Setup(x => x.Property).Returns("test");
a.SetupAllProperties();

Assert.NotNull(a.Object.Property);

这就是AutoFixture在幕后创建Interface实例的方式。此测试失败,Moq版本等于或大于4.2.1502.911,但通过较低版本。

只需在软件包管理器控制台上运行:

install-package Moq -version 4.2.1409.1722

此处正在跟踪此错误:https://github.com/Moq/moq4/issues/196