15

FluentAssertionsを使用して比較しようとしているリストのペアがあります。比較を簡単にコーディングできますが、Fluent Assertionsを使用して、テスト失敗メッセージに表示される理由を取得したいと思います。

これまでに見たものはすべて、大文字と小文字を区別するデフォルトのObject.Equals比較を使用しているようです。IComparerをEqualまたはContainsメソッドに渡すことができないようですが、他の方法はありますか?

[TestMethod()]
public void foo()
{
  var actual = new List<string> { "ONE", "TWO", "THREE", "FOUR" };
  var expected = new List<string> { "One", "Two", "Three", "Four" };

  actual.Should().Equal(expected);
}
4

4 に答える 4

3

オプションのラムダ式を Equal() メソッドに追加できます。次に、次のようなことができます

[TestMethod()] 
public void foo() 
{ 
   var actual = new List<string> { "ONE", "TWO", "THREE", "FOUR" }; 
   var expected = new List<string> { "One", "Two", "Three", "Four" }; 

  actual.Should().Equal(expected, 
    (o1, o2) => string.Compare(o1, o2, StringComparison.InvariantCultureIgnoreCase))
} 

IComparer も可能ですが、Equal() のデフォルトの動作に対する時折の例外は、追加のカスタム作成クラスを保証しないと思います。実際、別の IComparer がテストの意図を曖昧にする可能性があります。皆さんが考える最善の解決策を教えてください。リリース 1.8.0 の Codeplex の問題として追加できます。

于 2012-03-27T06:15:02.767 に答える
1

拡張メソッド (または 2 つ) を介して新しい Fluent アサーションを追加するのはどうですか? .EqualInsensitively(...)文字列のコレクションに対して利用可能な流暢なアサーションにを追加するコードを作成しました。

コードは少し長く、MS-PL は CC-Wiki と互換性がない可能性があるため、これを外部のペーストビンに実装するコードを配置しました。

次のようなものを使用します。

private static void Main()
{
    var mylist = new List<string> {"abc", "DEF", "GHI"};
    mylist.Should().EqualInsensitively(new[] {"AbC", "def", "GHI"})
      .And.NotContain(string.Empty); //Emaple of chaining
}
于 2012-03-26T20:12:28.160 に答える
0

あなたは自分自身のために拡張メソッドを書くことができIEnumerable<string>ます(これは私がこれを行う方法です)そして私はいくつかのユニットテストフレームワークがすでにそうしていると思います(FSUnit AFAIK)

簡単な例を次に示します (大幅に改善できますが、改善する必要があります)。

public static AssertEqualSetCaseInsensitive(this IEnumerable<string> actual, IEnumerable<string> expected)
{
   if (actual.Count() != expected.Count())
      Assert.Fail("not same number of elements");

   if (!actual.All(a => expected.Any(e => e.ToLower() == a.ToLower()))
      Assert.Fail("not same sets");
}

のように使うだけ

actual.AssertEqualSetCaseInsensitive(expected);
于 2012-03-26T18:42:48.083 に答える