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