xUnit:2つのList <T>が等しいとアサートしますか?


108

TDDとxUnitは初めてなので、次のようなメソッドをテストしたいと思います。

List<T> DeleteElements<T>(this List<T> a, List<T> b);

使用できるAssertメソッドはありますか?このようなものがいいと思います

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

このようなものはありますか?

回答:


135

xUnit.Netはコレクションを認識するので、必要なのは

Assert.Equal(expected, actual); // Order is important

CollectionAsserts.csで利用可能な他のコレクションアサーションを確認できます

以下のためにNUnitのライブラリのコレクションの比較方法があります

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

そして

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

詳細はこちら:CollectionAssert

MbUnitには、NUnitに類似したコレクションアサーションもあります:Assert.Collections.cs



1
コメントの新しいリンクも壊れています。
スコットスタッフォード

1
プロジェクトはGitHubに移動されましたが、その特定のソースファイルもそこでは見つかりませんでした。
MEMark 2014

1
複雑なオブジェクトの場合、これを機能させるにはEqual + GetHasCodeが必要であること、またはEqualメソッドにカスタムEqulityComparerを与えることを忘れないでください
maracuja-juice

2
xUnit Equalメソッドは、内容が等しい2つのIEnumerableに対してfalseを返します。
Vladimir Kocjancic 2018

31

現在のバージョンのXUnit(1.5)では、次のように使用できます。

Assert.Equal(期待される、実際の);

上記のメソッドは、2つのリストの要素ごとの比較を行います。これが以前のバージョンで機能するかどうかはわかりません。


7
コレクションのAssert.Equalで私が遭遇した問題は、要素が両方に存在していても、コレクションの要素の順序が異なる場合に失敗することです。
スコットローレンス

1
@ ScottA.Lawrenceリストにも順序があります!HashSetでも同じ動作が得られますか?
johv

@johv私はHashSetsでテストしていませんが、それは良い考えです。試す機会があったら、ここで答えるのを忘れないようにしよう。
スコットローレンス

2
また、コレクションタイプが異なる場合は、両方に同じアイテムが同じ順序で含まれている場合でも、失敗するようです。
James White

3
ただし、出力は非常に不安定です。2つのリストが異なる場所はわかりません!:(
Zordid '25

16

xUnitで、各要素のプロパティをチェリーピックしてテストしたい場合は、Assert.Collectionを使用できます。

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

これにより、予想される数がテストされ、各アクションが検証されることが保証されます。


2

最近、asp.netコア2.2アプリでパッケージを使用xUnit 2.4.0してMoq 4.10.1いました。

私の場合、2つのステップのプロセスでそれを機能させることができました。

  1. の実装の定義 IEqualityComparer<T>

  2. 比較インスタンスを3番目のパラメーターとしてAssert.Trueメソッドに渡します。

    Assert.True(expected, actual, new MyEqualityComparer());

しかし、FluentAssertionsパッケージを使用して同じ結果を得る別の良い方法があります。次のことを実行できます。

// Assert          
expected.Should().BeEquivalentTo(actual));

興味深いことにAssert.Equal()、2つのリストの要素を同じ順序で並べるように注文しても、常に失敗します。


2
順序に問題があるBeEquivalentToは順序を気にしません(テストがBeEquivalentToで合格し、assert.Equalでは合格しない理由)
RagnaRock
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.