C# AutoFixture无法识别冻结对象
填充依赖项时,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) {
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”对象,所以我必须手动创建它。