6

我将 AutoFixture 与 AutoMoq 一起使用。我尝试创建一个具有 getter 但没有 setter 的属性的类的假实例。我希望 AutoFixture 能够配置模拟,因此即使没有设置器,它也会返回给定的值。

我的代码是这样的:

var data = new List<Data>() { new Data() };
var userManager = fixture.Build<IRepository>()
      //.With(x => x.Data, data)
        .CreateAnonymous();
Mock.Get(userManager).Setup(x => x.Data).Returns(data);

不幸的是,“With”方法在这种情况下不起作用,因为自动夹具说 Data 没有任何设置器,这为什么我必须在之后通过直接调用模拟来设置值。

有没有办法让自动夹具自己做到这一点,所以我不需要最后一行代码?

编辑:我犯了一个错误,代码示例不起作用。它应该是

var data = new List<Data>() { new Data() };
var userManager = fixture.CreateAnonymous<IRepository>();
Mock.Get(userManager).Setup(x => x.Data).Returns(data)

不过,如果有假实例的 with 方法会很好。

4

1 回答 1

6

AutoFixture.AutoMoq不会为您设置测试替身。

如果您想避免IRepository.Data在每个测试用例中指定设置,您可以将设置打包在Customization中。

public class RepositoryCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Register(() =>
        {
            var td = new Mock<IRepository>();
            td.SetupGet(r => r.Data).Returns(fixture.CreateMany<Data>());
            return td.Object;
        });
    }
}

这样,以下测试通过:

[Fact]
public void AutoProperty()
{
    var fixture = new Fixture().Customize(new RepositoryCustomization());
    var repo = fixture.Create<IRepository>();
    Assert.NotEmpty(repo.Data);
}

理论上,可以编写反映接口成员并为每个成员设置返回值的自动化代码,但是 IMO,这绝不应该是 AutoFixture.AutoMoq 的默认行为。

于 2013-03-13T06:55:48.850 回答