AutoFixture 无法识别冻结的对象

AutoFixture not recognizing frozen object

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 填充。

问题:'alpha.beta' 始终是 CastleProxy,而不是我注入的 'a' 对象...

使用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 - 抱歉造成混淆。

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

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() 的版本)。