2013-03-11 169 views
3

我使用带有AutoMoq的AutoFixture。我尝试创建一个具有getter属性但没有setter的类的假实例。我期望AutoFixture配置模拟器,因此即使没有setter也会返回给定的值。AutoFixture.AutoMoq:将值设置为只读属性

我的代码是类似的东西:

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); 

不幸的是,“有了”,因为汽车灯具说,数据不具有任何二传手它为什么我设置数值方法不会在这种情况下工作之后直接调用模拟。

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

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

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

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

+0

在某些情况下,你可能想要Moq的'SetupGet'而不是'Setup'(但这不是你的问题)。 FWIW我非常确定AF内置的东西不会处理你要找的东西(这似乎不太适合建立状态,更多的是可以改变/替换读取方)。你能否确认你没有处理那些有明确方法推入状态的对象(例如通过ctor params?) – 2013-03-11 20:59:31

+0

相关:http://stackoverflow.com/questions/12963019/how-do-i-get-autofixture -automoq-return-results-from-injected-services-in-an – 2013-03-11 21:14:06

回答

2

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的默认行为。

+0

实际上,我想增强“With”方法。但如果不可能,这不是问题。谢谢您的回答。 – 2013-03-14 10:21:41

+0

您想用哪种方式来增强'With'方法。它缺少什么? – 2013-03-14 11:41:08

+1

@MarkSeemann我相信他是说默认情况很好,但最好是有类似于'.With(x => x.Data,data)'的东西,就好像它分配给那个特定的属性没有setter(使用AutoMoq时)。 – 2013-07-03 22:54:51