2012-02-02 103 views
2

的此代码工作正常FluentAssertion无法比较枚举字符串

[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

does Equal()比较它是相同的实例还是相同的值(不一样)? – kenny 2012-02-02 18:52:22

回答

3

发生这种情况是因为编译器选择了w由于C#中的限制,Equals()的rong重载。在你的特定情况下,它将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"});    
} 
+0

非常感谢,丹尼斯 – 2012-02-02 19:46:47

+0

“而不是等于(IEnumerable)”是不正确的。 OP的目标是使用'Equals(params object [])'(如第一个例子),因为已经传递了3个参数,而不是'IEnumerable'。 – digEmAll 2012-02-02 20:07:49

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

我认为作为肯尼在你做参考平等,其中这些字符串是不一样的参考注释确认。

0

请尝试SequenceEquals?

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

而且Equals方法只是比较平等的引用。

下面是我的一个项目,从单元测试线:

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

在“预期”和“实际的”实施IEQuatable元素的全部。

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