将AutoFixture与具有许多构造函数的类一起使用

时间:2017-10-03 19:58:46

标签: c# autofixture

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

public ContentResult PostSO(string data)
{
    return null;
}

如何配置AutoFixture以便在此构造函数之间轻松切换?

我希望AutoFixture使用构造函数创建public class A { public A(B b) { ... } public A(C c) { ... } } 的实例,我为其明确指定了默认值(call A)。

例如:

Register

我能用AutoFixtre实现这样的行为吗?或者你能为配置构造函数建议另一种方法吗?

我明白,我可以var fixture = new Fixture(); fixture.Register(() => new B("stateB")); fixture.Create<A>(); // Calls constructor A(B b) 使用Customize构造函数查询策略,但这种方法看起来很混乱......

1 个答案:

答案 0 :(得分:0)

通常,AutoFixture不会为您提供用于以无类型方式指定ad hoc构造函数参数的API。这是设计的。

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

Consider other options用于处理或测试特定的构造函数参数或重载。

那就是说,这里有一些建议。

使用构造函数

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

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

var a = new A(b);

您仍会获得AutoFixture创建的B值。

注册A

您还可以使用Register机制:

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

var a = fixture.Create<A>();

这显然总是使用带有B值的构造函数重载。

使用获取

另一种选择是使用类型安全的Get扩展方法:

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

var a = fixture.Get((B b) => new A(b));

这使您有机会以稍微更专业的方式构建A值。这也使您可以重用相同的Fixture,但请求另一个使用不同构造函数重载的对象:

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

此处,c对象仍由AutoFixture创建。

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