2

此代码工作正常

    [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() 中的案例?

4

4 回答 4

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");
于 2012-02-02T19:13:51.430 回答
3

发生这种情况是因为由于 C# 的限制,编译器选择了错误的 Equals() 重载。在您的特定情况下,它采用 Equals(string expected, string reason, params string[] args),而不是 Equals(IEnumerable)。我从来没有找到一种简单的方法来解决 FluentAssertions 中的这种歧义。

要解决您的问题,请将预期值包装在一个数组中。

[Test] 
public void foo()  
{ 
  var collection = new[] { "1", "2", "3" }; 
  collection.Should().Equal(new[] {"1", "2", "3"});              
}
于 2012-02-02T19:21:04.877 回答
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 在评论中承认您正在执行引用相等,而这些字符串不是相同的引用。

于 2012-02-02T18:56:14.150 回答
0

试试 SequenceEquals 吗?

http://msdn.microsoft.com/en-us/library/bb342073.aspx

Equals 方法只是比较引用是否相等。

这是我的一个项目中单元测试的一行:

Assert.IsTrue(expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)));

“预期”和“实际”中的所有元素都实现了 IEQuatable。

于 2012-02-02T19:07:04.393 回答