1

オペランドが適切でない場合にスローする演算子があります。(具体的には、int ベースのクラスで 10 進数の乗算を行っています。これは、意味がある場合 (例: 2 * 0.5) は許可されますが、結果が丸められた数値でない場合はスローされます (例: 2*0.3))。

nUNit の Assert.Throws<>() を使用してこれをテストすることはできないようです。これを呼び出すと考えられるすべての方法でコンパイラ エラーが発生するためです。

Assert.Throws<InvalidOperationException>(originalValue * badDecimalMultiplier);
Assert.Throws<InvalidOperationException>(dummy => originalValue * badDecimalMultiplier);
Assert.Throws<InvalidOperationException>(dummy => dummy = originalValue * badDecimalMultiplier);
Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier);
  • 最初のものは、操作の結果をパラメーターとして Throws() に渡そうとしますが、Throws は TestDelegate のみを受け入れるため失敗します。
  • 2 つ目は、「代入、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式のみをステートメントとして使用できます」というエラーで失敗します。
  • 3 番目は、「デリゲート 'NUnit.Framework.TestDelegate' は引数を 1 つ取りません」で失敗します。
  • 4番目(および私が見つけたすべてのバリエーション)では、宣言されていない変数に割り当てることはできません(驚くべきことではありません)

手動で例外をキャッチしてテストする必要があると思いますか? それか、操作を保持する実際のメソッドを定義しますが、これはあまり良くないようです。

何か不足していますか?そうでない場合は、次にこれを調べようとする人が答えを得ることができるように、確認を取得できますか.

4

2 に答える 2

2

ラムダの外で変数を宣言できます。

MyClass dummy;
Assert.Throws<InvalidOperationException>(() => 
         dummy = originalValue * badDecimalMultiplier);

メソッドを呼び出すこともできます。

Assert.Throws<InvalidOperationException>(() => 
       (originalValue * badDecimalMultiplier).ToString());
于 2013-11-10T13:22:43.170 に答える
0

最後の行を書いたときに、解決策を見つけました。

  MyIntValuedClass dummy;
  Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier);

デリゲートがあるため、Throws() は満足しています。引数がないため、デリゲートは満足しています。そして、定義された変数に割り当てているため、操作は満足しています。

R# はダミーが使用されていないと不満を言っていますが、それは驚くべきことではありません。

これは最善の解決策ではなく、他のアイデアも歓迎しますが、次の人が探しに来るためにここに答えがあることを確認したかったのです.

于 2013-11-10T13:23:29.140 に答える