我在应用程序中有各种对象,并且每个都有无效的方法来测试是否正确设置了所有属性的值(根据业务规则)。现在,要测试每个违规是否有效会抛出false,我将必须写为检查规则的许多测试都是有效的。有更简单的方法吗?我正在使用MBunit。
答案 0 :(得分:1)
我不确定你想要什么更简单。您可能想要创建一个辅助方法来创建一个有效的对象,以便每个测试都是这样的:
public void FooWithNullNameIsInvalid()
{
Foo foo = CreateValidFoo();
foo.Name = null;
Assert.IsFalse(foo.IsValid);
}
然后每个测试都相对较小,测试一件事,并且易于理解。是的,这种事情可能有点单调,但它确实有效。
使测试更短的另一种选择是:
private void AssertInvalidChange(Action<Foo> change)
{
Foo foo = CreateValidFoo();
change(foo);
Assert.IsFalse(foo.IsValid);
}
然后每个测试可以采用以下形式:
public void FooWithNullNameIsInvalid()
{
AssertInvalidChange(foo => foo.Name = null);
}
现在,在那个阶段,可以将所有有效性测试放在一个方法中,每个无效更改一行。这当然会更简单,但它会违反“唯一测试一件事”的口头禅。就个人而言,我相当宽松 - 我会非常想要这样做。缺点是如果你有多个 失败的测试,你一次只能看到一个失败。
答案 1 :(得分:0)
您可能需要考虑重复测试工作的感知需求是否表示SUT中代码重复。
也许您可以将业务规则实现为Strategy,在这种情况下,您只需要测试一次策略实施,然后为每个SUT验证他们使用正确的策略。
否则,一组Parameterized Tests听起来像是要走的路。