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


111

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

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

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

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

警告xUnit2013:コレクションサイズのチェックにAssert.Equal()を使用しないでください。

ただし、警告では代替案は提案されておらず、グーグル検索により、この警告が出力されることを確認するテストのためにxUnitのソースコードが表示されます。

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


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

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


stuffCollection.Count()別の変数に格納してそれをアサートに渡すと、同じエラーが発生しますか?
hellyale

たぶんこれ
Uwe Keim 2017年

回答:


112

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

xunit

あなたの場合、Assert.Singleあなたはちょうど1つのアイテムを期待しているのでそれを使用することを望んでいます。412などの任意の数をアサートしている場合、の使用に関する警告は表示されませんCountSingle1つのアイテムを期待している場合、またはアイテムEmptyを期待していない場合にのみ使用を提案します。


6
ありがとう、それは理にかなっています。FWIW、私はこれをVS Codeでビルドするときに見ましたが、クイックアクションは表示されなかったので、実際に警告メッセージに修正提案を含めると、はるかに役立ちます。
Tomas Aschan 2017年

2
@TomasLycken-ああ。はい、ここに問題があります:github.com/xunit/xunit/issues/1423
vcsjones

5
私はその振る舞いのファンではありません。1カウントが偶発的な場合もあり、.Single()の呼び出しを強制することはあまり表現力がないように見えます。テストは異なるカウントを期待するように変更される可能性があり、数値を変更するだけでなく、完全に異なるメソッドを呼び出すために変更を行わなければならないのは煩わしいようです。
vargonian、

2
シングルはシングルアイテムに最適です。3つのアイテムがあり、完全なAssert.Collectionを記述したくありません。xUnitにはAssert.Tripleがありますか?笑
Pawel Cioch

1
@PawelCiochに応じxunit.net/xunit.analyzers/rules/xUnit2013.html彼らが持っているEmptySingleNotEmpty-あなたはxUnit2013がトリガーいけない動的な値を期待しています。
mbx

2

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

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

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

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

2
私はかなり確信している、これはないideomatic方法。
mbx

1

リスト内の単一の要素については、代わりにこれを使用するのが最善です: Assert.Single(resultList);


-1

xUnitで以下のようにCountプロパティを使用すると、同じ問題が発生しました。

ここに画像の説明を入力してください

その後、コレクションでCount()関数を使用すると、問題が解決しました。


問題を修正しましたが、XUnitをまだ使用していません!
Daniel Eisenreich 2018

8
@DanielEisenreich特定の数が1より大きい場合にその数をアサートする正しい方法は何ですか?
SomeGuyOnAComputer 2018

@SomeGuyOnAComputerと他の4つの賛成票。私が言ったことを忘れて、私は生意気すぎました。それが大きい場合、他に選択肢はありません。
ダニエルアイゼンライヒ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.