AutoConfiguredMoqCustomization和不可设置的属性

本文关键字:属性 设置 AutoConfiguredMoqCustomization | 更新日期: 2023-09-27 18:08:22

我如何强制AutoFixture,已配置AutoConfiguredMoqCustomization,自动模拟接口及其只读属性?

为了更清楚,让我们假设我有这样一个接口:

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

AutoConfiguredMoqCustomization和不可设置的属性

这是由于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,则此测试失败,但如果版本低于4.2.1502.911,则通过。

在包管理器控制台中运行:

install-package Moq -version 4.2.1409.1722

这个bug在这里被跟踪:https://github.com/Moq/moq4/issues/196