我是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);
有类似的东西吗?
答案 0 :(得分:97)
xUnit.Net 会识别集合,因此您只需要执行
Assert.Equal(expected, actual); // Order is important
中查看其他可用的集合断言
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
答案 1 :(得分:29)
在当前版本的XUnit(1.5)中,您只需使用
即可Assert.Equal(expected,actual);
上述方法将对两个列表进行逐元素比较。 我不确定这是否适用于任何先前版本。
答案 2 :(得分:11)
使用xUnit,如果你想挑选每个元素的属性来测试你可以使用Assert.Collection。
Assert.Collection(elements,
elem1 => Assert.Equal(expect1, elem1.SomeProperty),
elem2 => {
Assert.Equal(expect2, elem2.SomeProperty);
Assert.True(elem2.TrueProperty);
});
这会测试预期的计数并确保每个操作都经过验证。
答案 3 :(得分:0)
最近,我在asp.net core 2.2应用程序中使用了xUnit 2.4.0
和Moq 4.10.1
软件包。
就我而言,我设法通过两个步骤来使其工作:
IEqualityComparer<T>
的实现将比较器实例作为第三个参数传递到Assert.True
方法中:
Assert.True(expected, actual, new MyEqualityComparer());
但是还有另一种更好的方法,可以使用FluentAssertions包来获得相同的结果。它允许您执行以下操作:
// Assert
expected.Should().BeEquivalentTo(actual));
有趣的是,Assert.Equal()
总是失败,即使我命令两个列表的元素以相同的顺序获取它们。