1

私はさまざまな機能を実行する関数クラスを持っています (衝撃的です、私は知っています)。そのような関数の 1 つは、指定された年の祝日のリストを返すことです。各計算には独自のプライベート関数があるため、パブリック関数は実際にはさまざまな休日をリストにコンパイルするだけです。

これでいくつかのテストを実行したいのですが、プライベート メソッドでテストを実行できないことは明らかなので、TestInitialize メソッドのリストを取り出して、それをさまざまなテストに使用します。

問題は、元旦を次のようなもので引き抜いたとしlist.SingleOrDefault(p => p.HolidayName.Equals("New Year's Day"))ます。意図したテストを実行する前に、それがnullかどうかを確認するのが最善です(私が知る限り、それ自体が2つのアサートです) ...)。

それで、私が推測する2つの質問。1. この状況は、ルール1 assert per unit test
の例外ですか? それとも、null アサーションと週末アサーションを分離する必要がありますか? 2. 私が知る限り、週末ではないことを確認するための 2 つのアサーションがあります。1 つは曜日が土曜日と等しくないかどうかをチェックし、もう 1 つは曜日が日曜日と等しくないかどうかをチェックします。それとも私はここで間違っていますか?

4

2 に答える 2

4

そのような関数の 1 つは、指定された年の祝日のリストを返すことです。

これはあなたの契約であり、これはあなたがテストすべきものです。

各計算には独自のプライベート関数があるため、パブリック関数は実際にはさまざまな休日をリストにコンパイルするだけです。

これは無関係であり、中身がどのように見えるかを気にする必要はありません。

さて、あなたの主な方法は、特定の年の予想される休日ごとに1つの単体テストを必要とすると言った. このようなテストでは、休日の詳細を確認します: 曜日、日付、名前 -複数の assertsを使用します。それ以外に、メソッドにはいくつかの境界チェック (年の範囲で機能するため) と入力値の検証 (年が実際に年を表していることを確認するなど) が必要になる場合があります。

いくつかのアドバイス:

  • テストするときは、メソッドの呼び出し元が何を期待するかを常に考えてみてください。次に、それらの仮定に基づいてテストを作成します。呼び出し元は休日のリストを期待しており、このメソッドをテストするときはそれが主な焦点となるはずです。
  • テストごとに 1 つの assert は非常に危険な誤解です。単一のAssert.AreEqual ...呼び出しではなく、1 つの論理的な概念を検証することです (ここまたはここで言及されているように)。あなたの場合、休日はそのような概念です。必要なすべてのプロパティをチェックして、それを検証します (その正確性を主張します)。祝日が正しい日付であることを知っていても、それが何の祝日かを知らなければ意味がありません。
于 2013-11-15T09:31:31.610 に答える
3

プライベート メソッドをテストできないことは既にわかっていますが、内部メソッドをテストすることができます。それが意味をなさない場合は、それらをプライベートにして、あなたがしようとしているようにテストしてください.

最初の懸念事項については、そこにあるすべての規則に従う必要はありません。あなたがプロジェクトの一人である場合は、あなたの気持ちに従ってください。私がこれまでに書いたテストで、アサートが 1 つしか含まれていないものは考えられません。ほとんどのテスト フレームワークは、テスト中に何が問題だったかを正確に指摘できます。最初に null をチェックしてから、期待値をチェックするのは理にかなっています。

2 番目の質問については、2 つのアサートはまったく必要ありません。列挙値のように、アプリケーションで日を認識することは理にかなっています。

public enum WeekDays
{
    Monday = 0
    Tuesday = 1
    ...
}

次に、次のように簡単にアサートできます

Assert.IsTrue(holiday.WeekDay < WeekDays.Saturday);

intから開始する場合は、曜日の値を指定する必要さえありませんMonday。最上位にある場合はSunday、必ず値 6 を指定してください。値は 0 になります。MSDNMondayの基礎となるenum値の詳細を参照してください。

それを列挙型として持つことができない、またはしたくない場合でも、それほど気の利いたものではありませんが、1 つのアサートでそれを作成できます。

Assert.IsFalse(holiday.WeekDay.StartsWith("S")); // assuming that the WeekDay is a string
于 2013-11-15T08:03:13.673 に答える