web-dev-qa-db-ja.com

Nunit、C#でのArgumentExceptionとそのメッセージの確認

Nunitのテストプログラムで、メッセージを確認して、書き込み引数例外が発生していることを確認します。

    [Test]
    public void ArgumentsWorkbookNameException()
    {
        const string workbookName = "Tester.xls";
        var args = new[] { workbookName, "Sheet1", "Source3.csv", "Sheet2", "Source4.csv" };
        Assert.Throws(typeof(ArgumentException), delegate { var appargs = new ApplicationArguments(args); }, "Invalid ending parameter of the workbook. Please use .xlsx");

    }

これをテストした後、メインプログラムでメッセージを変更した場合、これは機能しません。

        int wbLength = args[0].Length;

        // Telling the user to type in the correct workbook name file.
        if (args[0].Substring(wbLength-5,5)!=".xlsx")
        {
            throw new ArgumentException(
                "Invalid ending parameter of the workbook. Please use .xlsx random random");
        }

メッセージを変更したかどうかに関係なく、ユニットテストは引き続き成功しました。

どうすればいいのですか?または、C#にはそのようなものはありません。私の同僚は、RubyとRSPECにそのようなオプションがあると言いましたが、C#で100%確信していません。

31
Henry Zhang

Fluentインターフェイスを使用してアサーションを作成します。

Assert.That(() => new ApplicationArguments(args), 
    Throws.TypeOf<ArgumentException>()
        .With.Message.EqualTo("Invalid ending parameter of the workbook. Please use .xlsx random random"));
49
PleasantD

「そのようなテストは不必要にもろい」とジョンに同意します。ただし、例外メッセージを確認するには、少なくとも2つの方法があります。

1:Assert.Throwsは例外を返すので、そのメッセージに対してアサーションを作成できます。

var exception = Assert.Throws<ArgumentException>(() => new ApplicationArguments(args));
Assert.AreEqual("Invalid ending parameter of the workbook. Please use .xlsx random random", exception.Message);

2: ExpectedException 属性を使用することもできます。ただし、属性は、例外をスローするコードだけでなく、テストされたコード全体で例外を待機することに注意してください。したがって、この属性の使用はお勧めしません。

[Test]
[ExpectedException(typeof(ArgumentException), ExpectedMessage = "Invalid ending parameter of the workbook. Please use .xlsx random random")]
public void ArgumentsWorkbookNameException()
{
    const string workbookName = "Tester.xls";
    var args = new[] { workbookName, "Sheet1", "Source3.csv", "Sheet2", "Source4.csv" };
    new ApplicationArguments(args);
}
24

Assert.Throwsのメッセージパラメータは、予期される例外メッセージではありません。テストが失敗した場合に、アサーションの失敗に含めるエラーメッセージです。

私はNUnitがすぐに例外メッセージのテストをサポートしているとは思いません。そのようなテストはとにかく不必要に壊れやすいと私は主張します。 本当に独自のヘルパーメソッドを記述したい場合は、そうすることができますが、個人的にはお勧めしません。 (診断情報を含める場合を除いて、テスト失敗メッセージを指定することはほとんどありません。テストが失敗した場合でも、テストを確認するので、メッセージはあまり追加されません。)

I would代わりに、ジェネリックオーバーロードとラムダ式を使用することをお勧めします。

Assert.Throws<ArgumentException>(() => new ApplicationArguments(args));

(それが実際のコードである場合、他の問題があります-new[] { "xyz" }を引数として渡してみてください...)

4
Jon Skeet