AutoFixture无法识别冻结对象

时间:2017-07-11 15:21:30

标签: c# .net unit-testing autofixture

AutoFixture在填充依赖项时无法识别冻结对象。

public class Beta : IBeta
{
    private string text;

    public Beta(string text)
    {
        this.text = text;
    }
}  

public class Alpha : IAlpha
{
    public IBeta beta;

    public Alpha(IBeta beta)
    {
        this.beta = beta;
    }
}

public void Test()
{
    var fixture = new Fixture();

    IBeta beta = fixture.Freeze<IBeta>(new Beta("test"));
    IAlpha alpha = fixture.Create<Alpha>();
}

是的,Alpha不是IAlpha,因为我想要真正的Alpha,其依赖关系由AutoFixture填充。

问题:&#39; alpha.beta&#39;总是CastleProxy,而不是我注入的&#39; a&#39;对象...

2 个答案:

答案 0 :(得分:2)

使用Inject代替Freeze

public void Test()
{
    var fixture = new Fixture();

    fixture.Inject<IBeta>(new Beta("test"));
    IAlpha alpha = fixture.Create<Alpha>();
}

OP中的Freeze重载用于提供种子值,默认情况下,AutoFixture会忽略该种子值。

这是known design error on my part - 对此感到抱歉。

答案 1 :(得分:0)

我创建了一个扩展方法。它解决了我的问题。

public static class AutoFixtureExtensions
{
    public static TSeed FreezeSeed<TSeed>(this IFixture fixture, TSeed seed)
    {
        fixture.Inject<TSeed>(seed);
        return seed;
    }
}

在:

IBeta beta = new Beta("test");
fixture.Inject<IBeta>(beta);

IAlpha alpha = fixture.Create<Alpha>();
beta.foo();

v1之后:

// little gain in such use case
IBeta seed = new Beta("test");
IBeta beta = fixture.FreezeSeed<IBeta>(seed);

IAlpha alpha = fixture.Create<Alpha>();
beta.foo();

v2之后:

// more self-describing
IBeta beta = fixture.FreezeSeed<IBeta>(new Beta("test"));

IAlpha alpha = fixture.Create<Alpha>();
beta.foo();

实际上,可能没什么大不同,但它对我来说更方便和清晰(与使用Inject()的版本相比)。