相关疑难解决方法(0)

无法掌握Freeze/Inject/Register之间的区别

在开始之前,我是AutoFixture的忠实粉丝,我仍然在学习如何使用该工具.所以感谢开发了Autofixture先生Ploeh和所有贡献者.

那么让我们从我的问题开始吧.

根据 AutoFixture/AutoMoq忽略注入实例/冻结模拟

上面链接的有趣部分是给出了这段代码

Mock<ISettings> settingsMock = new Mock<ISettings>();
settingsMock.Setup(s => s.Get(settingKey)).Returns(xmlString);

ISettings settings = settingsMock.Object;
fixture.Inject(settings);
Run Code Online (Sandbox Code Playgroud)

马克回答哪个可以重写

fixture.Freeze<Mock<ISettings>>()
       .Setup(s => s.Get(settingKey)).Returns(xmlString);
Run Code Online (Sandbox Code Playgroud)

它看起来像一个语法糖,使用Freeze方法是一种在流畅的界面中编写模拟,配置和自动混合容器中的注入的方法.

在对网络进行一些研究之后,Freeze和Inject之间实际上存在功能差异.我发现了这个问题:https: //github.com/AutoFixture/AutoFixture/issues/59 ,它指出了 如何在AutoFixture中冻结空实例的答案

上面链接的作者描述了Freeze方法如下:

在内部,Freeze创建一个所请求类型的实例(例如IPayPalConfiguration)然后注入它,这样当你再次请求它时它将始终返回该实例

我明白我们这样做的时候

var customer = fixture.Freeze<Order>();
Run Code Online (Sandbox Code Playgroud)

每当我们的代码请求Order类型时,它将始终使用相同的Order实例.但是如果我在Freeze构造函数中指定我希望它使用特定的实例呢?

这是一个小代码示例:

[Fact]
public void MethodeName()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    fixture.Freeze<OrderLine>(new OrderLine("Foo"));
    var order = fixture.Create<Order>();
}

public class Order
{
    private readonly OrderLine _line;

    public Order(OrderLine line)
    {
        _line = line;
    }
}
public class OrderLine
{
    private readonly …
Run Code Online (Sandbox Code Playgroud)

c# autofixture

43
推荐指数
2
解决办法
1万
查看次数

标签 统计

autofixture ×1

c# ×1