此代码可以正常使用
[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()处理案例?
答案 0 :(得分:5)
问题是第二次调用解决了以下重载:
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");
答案 1 :(得分:3)
这是因为编译器选择了错误的Equals()重载,因为C#有限制。在您的特定情况下,它采用Equals(字符串预期,字符串原因,参数字符串[] args),而不是Equals(IEnumerable)。我从来没有找到一种简单的方法来解决FluentAssertions中的这种歧义。
要解决您的问题,请将预期值包装在数组中。
[Test]
public void foo()
{
var collection = new[] { "1", "2", "3" };
collection.Should().Equal(new[] {"1", "2", "3"});
}
答案 2 :(得分:0)
测试时会发生什么:
[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在评论中承认你正在进行引用相等,而这些字符串不是同一个引用。
答案 3 :(得分:0)
尝试使用SequenceEquals?
http://msdn.microsoft.com/en-us/library/bb342073.aspx
Equals方法只是比较相等的参考。
以下是我的一个项目中单元测试的一行:
Assert.IsTrue(expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)));
“expected”和“actual”中的所有元素都实现了IEQuatable。