私は現在、MsTestユニットテストをxUnitに変換しています。 xUnitを使用して、例外メッセージをテストする方法はありますか?例外タイプだけではなく、例外メッセージをテストすることは正しいですか?
例外タイプとメッセージの両方をテストするのは正しいと思います。そして、どちらも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つあるが、メッセージが異なる場合は、メッセージに対してアサートすることをお勧めします。
ところで、Resharperはtypeofを使用しないことを好み、代わりにAssert.IsTypeを提案します。
var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);
このようなもの
var ex = Record.Exception(() => DoSomeThing());
Assert.IsType(typeof(ArgumentNullException), ex);
Assert.True(ex.Message.Contains("Your exception message"));
例外は、テストの他の予想される結果と何ら変わりはありません。 2つの異なるメッセージが同じ例外タイプに入る可能性があるため、メッセージが正しいものであることをテストすることは自然です。ただし、個人的には、少なくともすべての例外を除いて、これを必須とは考えていません。
私たちのプロジェクトでは、各アプリケーションの例外にも「Message」オブジェクトがアタッチされているため、MessageIdのみを検証し、メッセージの引数が正しいことやメッセージのテキストを検証しません。たとえば、メッセージテキストが「間違ったパラメータ<{0}>が指定されました」の場合、フォーマット{0}に渡された引数が期待どおりであるかどうかはチェックされません。これは意図されたものではありません。メッセージには一意のIDがあるため、例外のMessageIDが「WRONG_PARAMETER_PROVIDED」であることを確認します。