web-dev-qa-db-ja.com

Assert.That vs Assert.True

好むもの:

Assert.That(obj.Foo, Is.EqualTo(true))

または

Assert.True(obj.Foo)

私にとって、両方の主張は同等であるため、どちらを優先すべきですか?

35
Razer

この特定の場合、違いはありません:ほぼ同じ詳細レベルの出力が表示されます(つまり、trueに評価されることが期待されていたものがfalseに評価されたことを示します。 )。同じことが言えます

_Assert.IsTrue(obj.Foo);
_

そして

_Assert.That(obj.Foo, Is.True);
_

チームはアサーションのスタイルを1つ選択し、すべてのテストを通してそれを使用する必要があります。チームが_Assert.That_スタイルを好む場合は、Assert.That(obj.Foo, Is.True)を使用する必要があります。

18
dasblinkenlight

Assert.Thatは、制約ベースのモデルと呼ばれます。メソッドはIConstraint型のパラメーターを受け取るため、柔軟性があります。これは、より一般的な階層または呼び出し構造でコードを構造化し、古いIConstraintを渡すことができることを意味します。これは、独自の カスタム制約 を構築できることを意味します

それは設計上の問題です。誰もが言っているように、あなたがまだ適切なエラーメッセージフィードバックを提供する必要があるとしても。

11
radarbob

わかりました。CIサーバーでテストスイートを実行しましたが、残念ながらそのうちの1つが失敗しました。ログを開くと、次のメッセージが表示されます

BusinessLogicTests.LoginTests.UserAutoLoginTests failed: expected true but was false

さて、もしあなたが見るすべての情報がAutoLoginTests boolのどこかが真であると期待されていたが、偽を受け取ったというのなら、このテストで何が間違っていたのでしょうか?次に、テストケースのソースファイルに移動して、どのアサーションが失敗したかを確認する必要があります。分かりますか

Assert.True(obj.Foo)

驚くべきことに.. 1時間前にこのモジュールを開発した場合にのみ、何が悪いのかを伝えるのはまだ難しいです。テストソースやおそらく本番ソースをさらに深く掘り下げてコードをデバッグする必要があるため、関数呼び出し内の変数のスペルを間違えたか、登録ユーザーをフィルタリングするために間違った述語を使用したかを最終的に把握できます。したがって、テストからの即時フィードバックをブロックしました。これは非常に貴重です。

私のポイントは、あなたのアサーションがどれだけ流fluentであるかは関係ありませんが(これも関連しています)、テストに失敗した場合にどのような情報を公開し、長時間働いていても根本的な失敗の理由をどれだけ早く取得できるかです前にこの機能で

5
Ilya Ivanov