我将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)
尽管如此,如果有一个伪实例的方法会很好。
答案 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的默认行为。