web-dev-qa-db-ja.com

xUnitでコレクションサイズを確認する慣用的な方法は何ですか?

私のテストスイートには、次のようなテストがあります。

[Fact]
public void VerifySomeStuff()
{
    var stuffCollection = GetSomeStuff();

    Assert.Equal(1, stuffCollection.Count());
}

このテストは期待どおりに機能しますが、実行するとxUnitが警告を出力します。

警告xUnit2013:Assert.Equal()を使用してコレクションサイズを確認しないでください。

ただし、警告には代替手段が提案されていないため、この警告が出力されることを確認するテストのために、Google検索でxUnitのソースコードに移動します。

Assert.Equal()がコレクションの長さを検証する正しい方法でない場合、何ですか?


明確にするために、私はxUnitを「だまして」この警告を出さないようにすることができることに気付きました変数を抽出するか、代わりにAssert.True(stuff.Count() == 1)を使用します。後者は単なるハックで、前者はxUnitがたとえばIEnumerable<T>の複数の反復を回避しようとすると、これは間違った方法です(問題の場合はコンパイラーのヒントを個別に取得するため)、xUnit自体は入力を複数回評価する必要はありません(で実際、C#関数呼び出しの仕組みにより、変数の抽出に関係なく同じ入力が得られる可能性があります)。

したがって、出力からその警告を削除することに興味があるだけではありません。私の質問への回答では、最初にライブラリに警告が含まれていることをwhyで説明し、why代わりに使用するアプローチの方が優れています。

72
Tomas Aschan

Xunitは、ほとんどの警告に対して迅速な修正を提供するため、「正しい」と思われるものを確認できるはずです。

xunit

あなたの場合、あなたは正確に1つのアイテムを期待しているのでAssert.Singleを使用することを望んでいます。 412のような任意の数値をアサートしている場合、Countの使用に関する警告は表示されません。アイテムが1つだけの場合はSingleを使用することをお勧めします。アイテムがない場合はEmptyを使用することをお勧めします。

76
vcsjones

私はこれが私に同じエラーを与えることを発見しました:

Assert.Equal(2, vm.Errors.Count());

そして、キャストするとエラーが表示されなくなりました。

Assert.Equal(2, (int)vm.Errors.Count());
2
devjc