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

Unit testing 如何为具有多个属性的对象编写单元测试,unit-testing,Unit Testing,我在应用程序中有各种对象,每个对象都有isvalid方法来测试是否正确设置了所有属性的值(根据业务规则)。现在,要测试每个冲突isvalid抛出false,我必须编写与在isvalid中检查规则一样多的测试。有没有更简单的方法来做到这一点?我正在使用MBunit。 < P>您可能想考虑在您的.中是否认为复制测试工作的需要并不表示代码复制< /强>。 也许您可以将业务规则作为一个组件来实现,在这种情况下,您只需要测试策略实现一次,然后针对每个SUT验证它们是否使用了正确的策略 否则,一组听起来像是

我在应用程序中有各种对象,每个对象都有isvalid方法来测试是否正确设置了所有属性的值(根据业务规则)。现在,要测试每个冲突isvalid抛出false,我必须编写与在isvalid中检查规则一样多的测试。有没有更简单的方法来做到这一点?我正在使用MBunit。

< P>您可能想考虑在您的.

中是否认为复制测试工作的需要并不表示<强>代码复制< /强>。 也许您可以将业务规则作为一个组件来实现,在这种情况下,您只需要测试策略实现一次,然后针对每个SUT验证它们是否使用了正确的策略


否则,一组听起来像是要走的路。

我不确定您希望什么更简单。您可能希望创建一个帮助器方法来创建一个有效的对象,以便每个测试都类似于:

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);
}