NUnit:断言三个或更多值相同

本文关键字:三个 断言 NUnit | 更新日期: 2023-09-27 18:34:04

我需要断言三个值是相同的。

例如,我需要这样的东西

Assert.AreEqual(person1.Name, person2.Name, person3.Name);
Assert.That(person1.Name, Is.EqualTo(person2.Name), Is.EqualTo(person3.Name));

这两个方法只允许比较两个值(前两个参数),第三个参数是输出消息。

我知道CollectionAssert但我不想只为这种情况创建IEnumerables

是否可以在不使用集合的情况下比较 NUnit 中的两个以上参数?接受params[]或其他东西的方法。

NUnit:断言三个或更多值相同

您可以执行 2 个单独的断言:

Assert.AreEqual(person1.Name, person2.Name);
Assert.AreEqual(person1.Name, person3.Name);

或者,您可以创建一个帮助程序函数:

public static class AssertEx
{
    public static void AllAreEqual<T>(params T[] items)
    {
        for (int i = 1; i < items.Length; i++)
        {
            Assert.AreEqual(items[0], items[i]);
        }
    }
}

你可以这样使用:

[Test]
public void TestShouldPass()
{
    var person1 = new Person { Name = "John" };
    var person2 = new Person { Name = "John" };
    var person3 = new Person { Name = "John" };
    AssertEx.AllAreEqual(person1.Name, person2.Name, person3.Name);
}
[Test]
public void TestShouldFail()
{
    var person1 = new Person { Name = "John" };
    var person2 = new Person { Name = "Bob" };
    var person3 = new Person { Name = "John" };
    AssertEx.AllAreEqual(person1.Name, person2.Name, person3.Name);
}

您可以使用基于约束的断言语法:

Assert.That(new [] { person1, person2, person3 }, Is.All.EqualTo(person1));
    [Test()]
    [TestCase("a","a","a")]
    [TestCase("a", "b", "a")]
    public void  Dummy(string a, string a1, string a2)
    {
        Assert.That(a, Is.EqualTo(a1).And.EqualTo(a2));
    }

    Expected: "b" and "a"
    But was:  "a"
    1 passed, 1 failed, 0 skipped, took 1.09 seconds (NUnit 2.5.5).

其他需要考虑的事情是 单元测试的第一条规则是"每个测试一个断言",这样可以更快地识别问题所在。 如果您断言所有 3 个都匹配,那么如果一个关闭,则必须找出哪一个。

public void All_Values_Match()
{
     Assert.AreEqual(person1.Name, person2.Name);
     Assert.AreEqual(person1.Name, person3.Name);
}

如果你做了一些类似的事情

 public void First_Second_Values_Match()
 {
      Assert.AreEqual(person1.Name, person2.Name);
 }
 public void First_Third_Values_Match()
 {
      Assert.AreEqual(person1.Name, person3.Name);
 }

这为您的测试提供了更清晰的结果。