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;对象...
答案 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()的版本相比)。