質問

現在、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」構成についても言及しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top