【问题标题】:xUnit : Assert two List<T> are equal?xUnit:断言两个 List<T> 相等?
【发布时间】:2010-09-29 23:57:49
【问题描述】:

我是 TDD 和 xUnit 的新手,所以我想测试我的方法,看起来像:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

我可以使用任何 Assert 方法吗?我认为这样的事情会很好

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

有这样的吗?

【问题讨论】:

    标签: c# xunit


    【解决方案1】:

    2021 年 4 月 1 日更新

    我建议使用FluentAssertions。它有一个庞大的 IntelliSense 友好断言库,适用于许多用例,包括 collections

    collection.Should().Equal(1, 2, 5, 8);
    collection.Should().NotEqual(8, 2, 3, 5);
    collection.Should().BeEquivalentTo(8, 2, 1, 5);
    

    原答案

    xUnit.Net 可以识别集合,因此您只需要这样做

    Assert.Equal(expected, actual); // Order is important
    

    您可以在CollectionAsserts.cs 中查看其他可用的集合断言

    对于NUnit库集合比较方法有

    CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters
    

    CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter
    

    更多详情:CollectionAssert

    MbUnit 也有类似于 NUnit 的集合断言:Assert.Collections.cs

    【讨论】:

    • cmets 中的新链接也损坏了。
    • 项目现已移至 GitHub,但我也无法在那里找到该特定源文件。
    • 对于复杂的对象不要忘记你需要一个 Equal+GetHasCode 才能工作,或者给 Equal 方法一个自定义的 EqulityComparer
    • xUnit Equal 方法对两个内容相同的 IEnumerables 返回 false。
    【解决方案2】:

    在当前版本的 XUnit (1.5) 中,您可以使用

    Assert.Equal(预期,实际);

    上述方法将对两个列表进行逐个元素的比较。 我不确定这是否适用于任何以前的版本。

    【讨论】:

    • 我在使用 Assert.Equal 时遇到的问题是,如果集合的元素顺序不同,即使两个元素都存在,它也会失败。
    • @ScottA.Lawrence 列表也有顺序!使用 HashSets 是否有相同的行为?
    • @johv 我没有用 HashSets 测试过,但这是个好主意。一旦我有机会尝试它,我会尽量记住在这里回答。
    • 如果集合类型不同,它似乎也会失败,即使它们都包含相同顺序的相同项目。
    • 但它的输出非常糟糕。它不会告诉您两个列表在哪里不同! :(
    【解决方案3】:

    对于 xUnit,如果您想挑选每个元素的属性进行测试,您可以使用 Assert.Collection。

    Assert.Collection(elements, 
      elem1 => Assert.Equal(expect1, elem1.SomeProperty),
      elem2 => { 
         Assert.Equal(expect2, elem2.SomeProperty);
         Assert.True(elem2.TrueProperty);
      });
    

    这会测试预期计数并确保每个操作都经过验证。

    【讨论】:

      【解决方案4】:

      最近,我在我的 asp.net core 2.2 应用程序中使用了 xUnit 2.4.0Moq 4.10.1 包。

      在我的情况下,我设法通过两步流程让它工作:

      1. 定义IEqualityComparer&lt;T&gt;的实现

      2. 将比较器实例作为第三个参数传递给Assert.True 方法:

        Assert.True(expected, actual, new MyEqualityComparer());

      但还有另一种更好的方法可以使用FluentAssertions 包获得相同的结果。它允许您执行以下操作:

      // Assert          
      expected.Should().BeEquivalentTo(actual));
      

      有趣的是,Assert.Equal() 总是失败,即使我对两个列表的元素进行排序以使它们以相同的顺序排列。

      【讨论】:

      • 您的订单有问题 BeEquivalentTo 不关心订单(这就是为什么您的测试通过 BeEquivalentTo 而不是 assert.Equal)
      【解决方案5】:

      刚刚找到似乎可以做到的 NotStrictEqual。

      【讨论】:

      • NotStrictEqual 可能会通过,但是当给定两个完全没有公共元素的数组时,它也会通过。对于这个问题,这不是一个有用的断言。
      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多