プログラマーな日々

プログラマーをやっています。好きなツール:WorkFlowy、好きな言語:C#、好きなサービス:Backlog、好きなAWS:AWS Lambda。

【.NET】MSTestのExpectedExceptionAttributeの奇妙な振る舞い

MSTestで、ExpectedExceptionAttributeを使用したところ、挙動が自分の想定と違っていたので、調べてみました。

検証環境

  • Visual Studio Community 2015 Update 3
  • .NET Framework 4.5.1

ソースコード

例外メッセージの相違によりテストが失敗することを期待して、以下のようなユニットテストを実行します。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test {
    [TestClass]
    public class UnitTest1 {
        [TestMethod]
        [ExpectedException(typeof(DivideByZeroException), "間違ったメッセージ")]
        public void ゼロ除算() {
            int i = 1;
            i = i / 0;
        }
    }
}

結果

ところが、予想に反して、このテストは成功します。

理由

調べたところ、以下の情報が見つかりました。

  • 第2引数は、例外メッセージとの相違をテストするためのものではなく、テストが失敗した時に出力させるメッセージ。
  • でもバグがあるので、このメッセージを指定しても何も出力されない。

ということみたいです。現状指定しても意味がないということですね。

解決方法

こちらには、ExpectedExceptionBaseAttributeを継承したクラスを作成する方法が書いてあります。