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} と等しいと予想されますが、{"1", "2", "3"} には 2 つの項目が含まれているため、多すぎます。

ここで何が問題なのですか?文字列の列挙可能を比較できなかったのはなぜですか?

そして、当然のことながら、私の質問は - foo() でケースを処理する方法は?

4

4 に答える 4

5

問題は、2 番目の呼び出しが次のオーバーロードに解決されることです。

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(IEnumerable) の代わりに Equals(string expected, string reason, params string[] args) を取っています。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);            
}

ケニーがコメントで認めたように、これらの文字列が同じ参照ではない参照の等価性を行っていると思います。

于 2012-02-02T18:56:14.150 に答える
0

代わりに SequenceEquals を試してみませんか?

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

Equals メソッドは、参照が等しいかどうかを比較しているだけです。

私のプロジェクトの1つでの単体テストの行は次のとおりです。

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

"expected" と "actual" の要素はすべて IEQuatable を実装しています。

于 2012-02-02T19:07:04.393 に答える