現在、MsTest 単体テストを xUnit に変換しています。xUnit で、例外メッセージをテストする方法はありますか? 例外タイプだけではなく、例外メッセージをテストするのは正しいですか?
8 に答える
例外の種類とメッセージの両方をテストするのが正しいと思います。どちらも xUnit では簡単です。
var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);
AAA パターンに一致するため、Record.Exception メソッドを使用することをお勧めします。
[Fact]
public void Divide_TwoNumbers_ExpectException()
{
var sut = new Calculator();
var exception = Record.Exception(() => sut.Divide(10, 0));
Assert.IsType(typeof(DivideByZeroException), exception);
}
お役に立てれば ...
xUnitは、Assert.Throwsを使用して例外タイプをテストします。必要に応じて、例外をキャッチし、メッセージに対してアサートすることができます。一般に、予期された例外がスローされることをテストしたいと思いますが、正確なメッセージは実際には必要ありません。
Assert.Throws<ArgumentNullException>()
例外は、単体テストを行っているカスタム例外があり、生成されたメッセージが期待どおりであることを確認したい場合です。または、同じ例外タイプをスローする方法が2つあるが、メッセージが異なる場合は、メッセージに対してアサートすることをお勧めします。
例外は、テストで予想される他の結果と同じです。2つの異なるメッセージが同じ例外タイプで発生する可能性があるため、メッセージが正しいものであることをテストするのは自然なことです。ただし、少なくともすべての例外において、私は個人的にそれを必須とは考えていません。
このプロジェクトでは、各アプリケーション例外にも「Message」オブジェクトがアタッチされているため、MessageIdのみを検証し、メッセージ引数またはメッセージのテキストが正しいことを検証しません。たとえば、メッセージテキストが「間違ったパラメータ<{0}>が指定されました」の場合、フォーマット{0}に渡された引数が期待どおりであるかどうかはチェックされません。これは意図されたものではありません。メッセージには一意のIDがあります。そのため、例外のMessageIDが「WRONG_PARAMETER_PROVIDED」であることを確認します。
xUnit Web サイトでは、「Record.Exception」構造についても言及されています。