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?

FluentAssession无法比较可枚举字符串

问题是第二次调用被解决为以下过载:

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。