FluentAssession无法比较可枚举字符串
本文关键字:枚举 字符串 比较 FluentAssession | 更新日期: 2023-09-27 18:22:11
此代码运行良好
[Test]
public void boo()
{
var collection = new[] { 1, 2, 3 };
collection.Should().Equal(1, 2, 3);
}
但是,这失败了
[Test]
public void foo()
{
var collection = new[] { "1", "2", "3" };
collection.Should().Equal("1", "2", "3");
}
故障信息为:
'集合应等于{1},因为2,但{"1"、"2"、"3"}包含的2个项目太多。'
这里怎么了?为什么字符串的枚举数不能进行比较?
当然,我的问题是——如何在foo()中处理case?
问题是第二次调用被解决为以下过载:
public AndConstraint<TAssertions> Equal(IEnumerable expected,
string reason,
params object[] reasonArgs);
代替:
public AndConstraint<TAssertions> Equal(params object[] elements);
为了获得所需的结果,您可以强制编译器使用正确的重载方法,例如:
collection.Should().Equal((object)"1", "2", "3");
由于C#中的限制,编译器选择了错误的Equals()重载,因此会发生这种情况。在您的特定情况下,它采用的是Equals(期望的字符串、字符串原因、params-string[]参数),而不是Equal(IEnumerable)。我从来没有找到一种简单的方法来解决FluentAssessments中的这种歧义。
要解决您的问题,请将期望的值封装在一个数组中。
[Test]
public void foo()
{
var collection = new[] { "1", "2", "3" };
collection.Should().Equal(new[] {"1", "2", "3"});
}
的测试发生了什么
[Test]
public void foo()
{
const string one = "1";
const string two = "2";
const string three = "3";
var collection = new[] { one, two, three };
collection.Should().Equal(one, two, three);
}
正如Kenny在评论中承认的那样,我认为你在做引用相等,因为这些字符串不是同一个引用。
是否改为尝试SequenceEquals?
http://msdn.microsoft.com/en-us/library/bb342073.aspx
Equals方法只是比较引用的相等性。
这是我的一个项目中单元测试的一行:
Assert.IsTrue(expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)));
"预期"answers"实际"中的所有元素都实现了IEQuatable。