xUnit:断言两个List 是平等的?

问题描述 投票:81回答:4

我是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);

有这样的事吗?

xunit.net
4个回答
98
投票

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


29
投票

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

Assert.Equal(expected,actual);

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


11
投票

使用xUnit,你是否想要挑选每个元素的属性来测试你可以使用Assert.Collection。

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

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


0
投票

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

在我的情况下,我设法通过两个步骤来完成它:

  1. 定义IEqualityComparer<T>的实现
  2. 将比较器实例作为第三个参数传递给Assert.True方法: Assert.True(expected, actual, new MyEqualityComparer());

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

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

有趣的是,即使我订购了两个列表的元素以使它们按照相同的顺序排列,Assert.Equal()也总是失败。

© www.soinside.com 2019 - 2024. All rights reserved.