web-dev-qa-db-ja.com

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

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

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

88
Petar Petrov

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

105

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

Assert.Equal(expected、actual);

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

29
hwiechers

XUnitを使用して、テストする各要素のプロパティを選択する場合は、Assert.Collectionを使用できます。

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

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

11
Drew Williams

最近、asp.net core 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));
_

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

1
Dmitry Stepanov