gpt4 book ai didi

c# - 如何让 AutoFixture AutoMoq 从实例化对象中的注入(inject)服务返回结果?

转载 作者:太空狗 更新时间:2023-10-30 01:07:19 26 4
gpt4 key购买 nike

我正在尝试测试使用存储库服务的服务类。我有自定义设置,我认为应该与我的存储库服务一起使用,但返回默认的匿名结果。如果您查看下面的代码示例,当我调用 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>>);

谢谢。

最佳答案

AutoFixture.AutoMoq 用作 Auto-Mocking Container .它会通过注入(inject) Mock<T> 自动组合对象图。实例到所述 T 的任何消费者中.

它无法配置 Mock<T>实例给你 - 毕竟,怎么可能呢?只有您(测试编写者)知道适当的交互应该是什么。

因此您提供的代码,包括对 Setup 的调用和 Returns , 是正确的,尽管您可能会考虑 Customization类是矫枉过正。

如果您需要自动执行大量重复的 Moq 设置,您应该考虑

  • 界面设计和消费模式是否合适
  • 如果 Fake没有比动态模拟更好的选择了

关于c# - 如何让 AutoFixture AutoMoq 从实例化对象中的注入(inject)服务返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com