C# 对具有多个构造函数的类使用AutoFixture

C# 对具有多个构造函数的类使用AutoFixture,c#,autofixture,C#,Autofixture,我有两个不同的构造函数: public class A { public A(B b) { ... } public A(C c) { ... } } 如何配置AutoFixture以便于在此构造函数之间切换 我希望AutoFixture使用构造函数创建一个A的实例,我为其参数显式指定默认值(调用Register) 例如: var fixture = new Fixture(); fixture.Register(() => new B("stateB")); fixtu

我有两个不同的构造函数:

public class A {
    public A(B b) { ... }
    public A(C c) { ... }
}
如何配置AutoFixture以便于在此构造函数之间切换

我希望AutoFixture使用构造函数创建一个
A
的实例,我为其参数显式指定默认值(调用
Register

例如:

var fixture = new Fixture();
fixture.Register(() => new B("stateB"));
fixture.Create<A>(); // Calls constructor A(B b)
var fixture=newfixture();
fixture.Register(()=>newb(“stateB”);
fixture.Create();//调用构造函数A(B)
我可以用AutoFixtre实现这样的行为吗?或者您可以为配置构造函数推荐另一种方法吗


我知道,我可以使用
TemplateMethodQUery
构造函数查询策略
自定义
fixture,但是这个方法看起来非常混乱…

一般来说,AutoFixture不会为您提供一个API,用于以非类型化方式指定特殊构造函数参数。这是故意的

AutoFixture最初是作为测试驱动开发的工具创建的。本着这种精神,我们应该倾听考验。当测试变得难以编写时,是时候重新考虑被测系统(SUT)的设计了。AutoFixture倾向于放大这种效果

用于处理或测试特定构造函数参数或重载

也就是说,这里有一些建议

使用构造函数 C语言已经为您提供了一种健壮且类型安全的方法来创建具有构造函数参数的新对象。为什么不用呢

var fixture = new Fixture();
fixture.Register(() => new B("stateB"));
var b = fixture.Create<B>();

var a = new A(b);
显然,这将始终使用构造函数重载,该重载接受
B

使用Get 另一个选项是使用类型安全
Get
扩展方法:

var fixture = new Fixture();
fixture.Register(() => new B("stateB"));

var a = fixture.Get((B b) => new A(b));
这使您有机会以稍微特别的方式构造
A
值。这也使您能够重用相同的
装置
,但请求另一个使用不同构造函数重载的对象:

var a = fixture.Get((C c) => new A(c));
这里,
c
对象仍然是由AutoFixture创建的

Get
(以及相应的
Do
)方法带有支持lambda表达式的更多算术的重载

var a = fixture.Get((C c) => new A(c));