例外が発生するケースをテストする場合には、 ExpectedException属性を使用します。
例えばこのような、例外が発生するメソッドがあったとして、
public void ThrowExceptionSample() { throw new System.Exception (); }
そのままそれをテストしただけだと、当然例外で失敗します。
[Test] public void ThrowExceptionSampleTest() { Sample s = new Sample (); s.ThrowExceptionSample (); }
結果
ですが、この例外が発生することが正しい、エラーケースをテストする場合には、この例外を拾わないといけません。
そのときにはExpectedExceptionを指定します。
[Test] [ExpectedException(typeof(System.Exception))] public void ThrowExceptionSampleTest() { Sample s = new Sample (); s.ThrowExceptionSample (); }
テストのほうに、ExceptedExceptionをつけてやると、例外が発生することでテストが通るようになります。
例外は、typeofの他に文字列でも指定できます。
[ExpectedException("System.Exception")]
エラーメッセージの内容までチェックしたい場合は、ExpectedMessageを指定します。
[ExpectedException("System.Exception", ExpectedMessage="test")]
とすると、System.Exceptionが投げられただけでなく、メッセージもチェックします。
実行した結果、メッセージが一致していないのでエラーになります。
これはデフォルトでは完全一致になりますが、MatchTypeの指定により判定を変えることができます。
MatchType | 判定 |
Exact | 完全一致 |
Contains | 部分一致 |
Regex | 正規表現一致 |
[ExpectedException("System.Exception", ExpectedMessage="type", MatchType=MessageMatch.Contains)]
というように指定します。
例外が発生した、だけでなくもっと複雑な判定処理をしたい場合は、処理するハンドラを登録します。
public void ThrowExceptionSampleHandlerMethod(System.Exception e) { Debug.Log ("handler method"); }
というメソッドを用意して、
[ExpectedException(typeof(System.Exception), Handler="ThrowExceptionSampleHandlerMethod")]
とした場合、例外が発生するとThrowExceptionSampleHandlerMethodが呼ばれます。
この中で、Assertを使用してテスト結果の判定を行います。何もしなければ成功します。