これは現在可能ではないか、それが良い考えでさえあるとは思いませんが、それは私が今考えていたものです。C#プロジェクトの単体テストにMSTestを使用しています。私のテストの1つで、次のことを行います。
MyClass instance;
try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}
instance.doStuff(); // Use of unassigned local variable 'instance'
このコードをコンパイルするにはinstance
、宣言時またはcatch
ブロック内のいずれかに値を割り当てる必要があります。代わりに後で行うこともできreturn
ますが、コンパイラがこの時点以降は実行を続行できない ことを知っAssert.Fail
ているだけでなく、それでも回避策です。私の知る限りでは、実行がそれを超えて進むことを許可することは決してないので、値なしで使用されることは決してありません。それでは、なぜそれに値を割り当てなければならないのですか?をのようなものに変更すると、コードは正常にコンパイルされます。例外により、初期化されていない状態で使用されるポイントに実行を進めることができないことがわかっているためです。Assert.Fail
instance
Assert.Fail
throw ex
instance
逆に、テストを失敗させたくなく、不確定としてマークした場合はどうなりますか?Assert.Inconclusive
の代わりに行うことができますFail
。コンパイラがその後実行が続行されないことを知っていれば便利です。
それでは、実行をどこに進めることができるかについての実行時とコンパイル時の知識の場合ですか?Assert.Fail
C#が、メンバー(この場合はメンバーが戻った後は決して実行を許可しない)を言う方法があるのは合理的でしょうか?多分それはメソッド属性の形であるかもしれません。これはコンパイラにとって有用ですか、それとも不必要な複雑さですか?
外部ユニットテスト
人々はこれがユニットテストを書くためのばかげた方法であると[正当に]指摘しているので、ユニットテストの領域外で私の質問を考えてみてください。
MyClass instance;
if (badThings)
{
someMethodThatWillNeverReturn();
}
else
{
instance = new MyClass();
}
instance.doStuff();
ここでは、への呼び出しを例外のスローに置き換えることができる可能性がsomeMethodThatWillNeverReturn
あります。おそらく、やるべきことがあれば、例外のコンストラクターでそれを行うことができます。
Resharperは知っています
return
後にAssert.Fail
またはを追加するとAssert.Inconclusive
、Resharperreturn
は灰色になり、「コードはヒューリスティックに到達不能です」というツールチップが表示されます。