如何为具有多个属性的对象编写单元测试

时间:2010-04-06 06:55:30

标签: unit-testing

我在应用程序中有各种对象,并且每个都有无效的方法来测试是否正确设置了所有属性的值(根据业务规则)。现在,要测试每个违规是否有效会抛出false,我将必须写为检查规则的许多测试都是有效的。有更简单的方法吗?我正在使用MBunit。

2 个答案:

答案 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听起来像是要走的路。