NFluent库 - 列表比较列表

时间:2017-11-07 09:56:27

标签: c# unit-testing

我使用NFluent检查列表清单是否有问题:

using NFluent;

[Fact]
public void CollectionTest()
{
    var a = new List<int> {1, 2};
    var b = new List<int> {3, 4};

    // List contains references to a and b
    var list1 = new List<List<int>> {a, b};
    Check.That(list1).ContainsExactly(a, b);  // OK
    Check.That(list1).ContainsExactly(new List<List<int>> {a, b});  // OK

    // List contains new instances of lists same as a and b
    var list2 = new List<List<int>>
    {
        new List<int> {1, 2}, // new instance, same as a
        new List<int> {3, 4}  // new instance, same as b
    };
    Assert.Equal(list2, new List<List<int>> { a, b });  // XUnit assert is OK
    Check.That(list2).ContainsExactly(a, b);  // Fail
    Check.That(list2).ContainsExactly(new List<List<int>> {a, b});  // Fail
}

问题:最后两次检查失败。

原因:问题在于ContainsExactly确实按引用比较了列表(如Equals),而不是按值进行比较(如SequenceEqual所做)。

解决方法:

  1. 使用可正确处理序列的XUnit Assert.Equal()
  2. 使用Equals()
  3. 编写实现Enumerable.SequenceEqual的List的自定义子类

    问题:我想继续使用NFluent,是否有一些简单的方法可以让最后两张支票有效?

1 个答案:

答案 0 :(得分:1)

简短回答:升级到NFluent 2.1+,比较行为已经修改。