测试两种方式应该相同的东西

时间:2009-11-11 16:29:18

标签: unit-testing tdd nunit

例如Equals方法。 a应该等于b,而b应该等于a。您是否可以使用以下两个断言在一个测试用例中检查这个:

[Test]
public void Equals_TwoEqualObjects_ReturnsTrue()
{
    var a = new Something();
    var b = new Something();

    Assert.That(a.Equals(b), Is.True);
    Assert.That(b.Equals(a), Is.True);
}

或者您认为这应该在两个单独的测试中完成,以便您在测试中不会有两个断言?

我认为在这种情况下有两个断言可能更清晰,因为我不确定我会称之为两个单独的测试,我有点认为哪个断言打破了哪个无关紧要测试。但无论如何,我很想知道其他人对此的看法,因为我是这方面的新手:)

5 个答案:

答案 0 :(得分:6)

我认为将它们放在一次测试中绝对没问题。

“每次测试一个断言”的想法更像是教条,而不是对我有用的东西。务实地进行测试。

是的,每次测试测试一项功能 - 但不要将自己局限于一个断言。

答案 1 :(得分:4)

我要说你必须在一个地方进行两项测试。一个对象等于另一个对象并且另一个对象等于另一个对象是不够的。这是相同的两个对象同时相等。

在两个断言案例中,你的测试意图(测试等于是可交换的)更清晰。

答案 2 :(得分:2)

它取决于。

如果你正在做一些复杂的事情,那么这是一个关键的功能并且不是一件容易的事,那么让测试足够精确以反映它是有意义的 - 它可以让你更快地隔离问题。

在很多情况下,这将是矫枉过正。测试必须有一个观点。

说这并不意味着你应该尽可能多地断言 - 这在另一个方向上太过分了。

底线是没有也不应该是绝对的规则。但一般的观点是保持测试

  • 用于隔离问题
  • 用于记录行为

答案 3 :(得分:1)

我会在两次测试中使用它们,好像其中一个链接设置不正确,你会确切地知道它是什么,记住单元测试测试最小的单位。

答案 4 :(得分:1)

你的两个断言都测试同样的事情。一个类型的一个对象等于另一个相同类型的对象。 Equals代码没有任何方法可以告诉它被调用哪些局部变量以及哪些是参数。我认为只需要一个断言就可以说任何类型的对象都等于该类型的任何其他对象就足够了。如果这是真的,那么交换就会成立。

相关问题