C# AutoFixture无法识别冻结对象

C# AutoFixture无法识别冻结对象,c#,.net,unit-testing,autofixture,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) {

填充依赖项时,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>();
}
公共类测试版:IBeta
{
私有字符串文本;
公共测试版(字符串文本)
{
this.text=文本;
}
}  
公共类Alpha:IAlpha
{
公共IBeta测试版;
公共阿尔法(IBeta贝塔)
{
这个β=β;
}
}
公开无效测试()
{
var fixture=新fixture();
IBetaβ=夹具冻结(新β(“测试”);
IAlpha alpha=fixture.Create();
}
是的,Alpha不是IAlpha,因为我想要真正的Alpha,依赖项由AutoFixture填充


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

使用
注入
而不是
冻结

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

    fixture.Inject<IBeta>(new Beta("test"));
    IAlpha alpha = fixture.Create<Alpha>();
}
公共无效测试()
{
var fixture=新fixture();
夹具。注入(新的β(“测试”);

IAlpha alpha alpha=fixture.Create-很抱歉造成混淆。

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

public static class AutoFixtureExtensions
{
    public static TSeed FreezeSeed<TSeed>(this IFixture fixture, TSeed seed)
    {
        fixture.Inject<TSeed>(seed);
        return seed;
    }
}
公共静态类AutoFixtureExtensions
{
公共静态TSeed冷冻种子(此IFixture夹具,TSeed种子)
{
注射(种子);
返回种子;
}
}
之前:

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

IAlpha alpha = fixture.Create<Alpha>();
beta.foo();
IBeta beta=新的beta(“测试”);
注射固定装置(β);
IAlpha alpha=fixture.Create();
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();
//在这种用例中几乎没有收益
IBeta种子=新测试(“测试”);
IBetaβ=固定装置。冷冻种子(种子);
IAlpha alpha=fixture.Create();
beta.foo();
v2之后:

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

IAlpha alpha = fixture.Create<Alpha>();
beta.foo();
//更多自我描述
IBetaβ=夹具。冷冻种子(新β(“测试”);
IAlpha alpha=fixture.Create();
beta.foo();

实际上,可能差别不大,但对我来说(比使用Inject()的版本)更方便、更清晰。

这里的情况是我以后还想使用这个“beta”对象(用于测试设置/验证),所以我必须使用“var beta=new beta”(“test”)扩展您的代码“首先,这使它变成了3行而不是1行,我想我会为此编写一个扩展方法。谢谢您的解释。@1_mile_run也许这不是您需要的,但以防万一:您可以使用AutoFixture作为自动模拟容器:是的,我非常喜欢自动模拟功能,而且我经常使用它。但是在这种情况下,我必须通过一些固定的测试连接字符串到“beta”对象,所以我必须手动创建它。