【问题标题】:FluentAssertion fail to compare enumerable of strings流利的断言无法比较可枚举的字符串
【发布时间】:2012-02-25 10:48:57
【问题描述】:

这段代码运行良好

    [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() 中的大小写?

【问题讨论】:

  • Equal() 是否比较它是相同的实例或相同的值(不相同)?

标签: c# .net tdd fluent-assertions


【解决方案1】:

问题是第二次调用被解析为以下重载:

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");

【讨论】:

    【解决方案2】:

    发生这种情况是因为编译器由于 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"});              
    }
    

    【讨论】:

    • "instead of Equals(IEnumerable)" 不正确。 OP 的目标是使用 Equals(params object[])(如第一个示例),因为它传递了 3 个参数,而不是一个 IEnumerable
    【解决方案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 在评论中承认您正在执行引用相等,而这些字符串不是相同的引用。

    【讨论】:

      【解决方案4】:

      改用 SequenceEquals 吗?

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-02-13
        • 1970-01-01
        • 2017-09-20
        • 2019-06-03
        • 1970-01-01
        • 2020-03-30
        • 2021-11-25
        • 2013-06-07
        • 2020-03-03
        相关资源
        最近更新 更多