如何让AutoFixture AutoMoq从实例化对象中的注入服务返回结果?

我正在尝试测试消费者存储库服务的服务类。 我设置了自定义设置,我相信它应该与我的存储库服务一起使用,而是返回默认的匿名结果。 如果您查看下面的代码示例,我正在尝试获取我在定制类中注册的“Foo”对象,当我调用svc.GetFoos方法时,我什么也得不到:

void Main() { var fixture = new Fixture().Customize( new CompositeCustomization( new Customization(), new AutoMoqCustomization())); var svc = fixture.CreateAnonymous(); Console.Write(svc.GetFoos().Count()); } // Define other methods and classes here public class Bar { public IQueryable GetFoos() { return _rep.Query(); } public Bar(IRepository rep) { _rep = rep; } private IRepository _rep; } public class Foo { public string Name {get;set;} } public class Customization : ICustomization { public void Customize(IFixture fixture) { var f = fixture .Build() .With(x => x.Name, "FromCustomize") .CreateMany(2) .AsQueryable(); fixture.Register<IQueryable>(() => f); } } public interface IRepository { IQueryable Query(); } 

如果我在夹具实例化之后将以下代码添加到Main方法,它可以按照我想要的方式工作,但后来我手动设置我的模拟,我不确定AutoFixture AutoMoq是什么让我:

 var mock = fixture.Freeze<Mock>(); mock .Setup(x => x.Query()) .Returns(fixture.CreateAnonymous<IQueryable>); 

谢谢。

AutoFixture.AutoMoq用作自动模拟容器 。 它将通过将Mock实例注入到所述T任何消费者中来自动组成对象图。

它无法为您配置Mock实例 – 毕竟,它怎么可能? 只有你(测试作者)知道适当的互动应该是什么。

因此,您提供的代码(包括对SetupReturns的调用)是正确的,尽管您可以考虑Customization类是否过度。

如果你需要自动化大量重复设置Moq,你应该考虑

  • 界面设计和消费模式是否合适
  • 如果假动作不是动态模拟的更好选择