Xunitを使用したユニットテスト例外メッセージ
-
28-10-2019 - |
質問
現在、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つの方法がある場合、メッセージに対してアサートすることは価値があります
例外は、テストの他の予想される結果と違いはありません。 2つの異なるメッセージが同じ例外タイプで提供できるため、メッセージが正しいものであることをテストするのは自然です。しかし、私は個人的には、少なくともすべての例外では、それを必須とは考えていません。
私たちのプロジェクトでは、各アプリケーションの例外には「メッセージ」オブジェクトも添付されているため、 MessageId のみ、メッセージ引数が正しいか、メッセージのテキストが正しいことを確認しません。たとえば、メッセージテキストが「間違ったパラメーター<{0}>が提供された」場合、フォーマット{0}に渡された引数が予想通りであることを確認しません - これは意図ではありません。メッセージには一意のIDがあるので、 MessageId 例外については、「誤った_parameter_provided」です。
このようなもの
var ex = Record.Exception(() => DoSomeThing());
Assert.IsType(typeof(ArgumentNullException), ex);
Assert.True(ex.Message.Contains("Your exception message"));
ところで、ResharperはTypeofを使用しないことを好み、代わりにAssert.Istypeを提案します。
var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);
Xunit Webサイトは、「Record.Exception」構成についても言及しています。