我正在尝试测试使用存储库服务的服务类。我设置了自定义设置,我认为应该与我的存储库服务一起使用,但返回默认的匿名结果。如果您查看下面的代码示例,当我调用 svc.GetFoos 方法时,我试图获取在自定义类中注册的“Foo”对象,但我什么也没得到:
void Main()
{
var fixture = new Fixture().Customize(
new CompositeCustomization(
new Customization(),
new AutoMoqCustomization()));
var svc = fixture.CreateAnonymous<Bar>();
Console.Write(svc.GetFoos().Count());
}
// Define other methods and classes here
public class Bar
{
public IQueryable<Foo> GetFoos()
{
return _rep.Query<Foo>();
}
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<Foo>()
.With(x => x.Name, "FromCustomize")
.CreateMany(2)
.AsQueryable();
fixture.Register<IQueryable<Foo>>(() => f);
}
}
public interface IRepository
{
IQueryable<T> Query<T>();
}
如果我在固定装置实例化后将以下代码添加到 Main 方法中,它会按照我想要的方式工作,但随后我手动设置我的模拟,并且我不确定 AutoFixture AutoMoq 会给我带来什么:
var mock = fixture.Freeze<Mock<IRepository>>();
mock
.Setup(x => x.Query<Foo>())
.Returns(fixture.CreateAnonymous<IQueryable<Foo>>);
Thanks.
AutoFixture.AutoMoq 用作自动模拟容器 http://blog.ploeh.dk/2013/03/11/auto-mocking-container/。它会通过注入自动组成对象图Mock<T>
实例到上述任何消费者T
.
它无法配置Mock<T>
为您提供实例 - 毕竟,怎么可能呢?只有您(测试编写者)知道适当的交互应该是什么。
所以您提供的代码,包括对Setup
and Returns
,是正确的,尽管您可能会考虑是否Customization
阶级是矫枉过正的。
如果您需要自动化大量重复的起订量设置,您应该考虑
- 界面设计和消费模式是否合适
- if a Fake http://msdn.microsoft.com/en-us/magazine/cc163358.aspx不会是比动态模拟更好的选择
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)