AutoFixture.AutoMoq:将值设置为只读属性

时间:2013-03-11 12:40:47

标签: moq autofixture automocking

我将AutoFixture与AutoMoq一起使用。我尝试创建一个类的假实例,该类具有带getter但没有setter的属性。我希望AutoFixture配置模拟,这样它就会返回给定的值,即使没有setter。

我的代码是这样的:

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没有任何setter,为什么我必须通过直接调用mock来设置值。

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

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

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

尽管如此,如果有一个伪实例的方法会很好。

1 个答案:

答案 0 :(得分:5)

AutoFixture.AutoMoq doesn't set up your Test Doubles为你。

如果您想避免在每个测试用例中为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的默认行为。