NUnit 3.0 でいくつかの単体テストを書いていますが、v2.x とは異なりExpectedException()
、ライブラリから削除されています。
この回答に基づいて、テストのどこでシステムが例外をスローすると予想されるかを具体的にキャッチしようとするロジックを明確に見ることができます(単に「テストのどこか」と言うのではなく)。
ただし、私は自分のアレンジ、アクト、アサートの手順について非常に明確にする傾向があり、これが課題になります。
私は次のようなことをしていました:
[Test, ExpectedException(typeof(FormatException))]
public void Should_not_convert_from_prinergy_date_time_sample1()
{
//Arrange
string testDate = "20121123120122";
//Act
testDate.FromPrinergyDateTime();
//Assert
Assert.Fail("FromPrinergyDateTime should throw an exception parsing invalid input.");
}
今、私は次のようなことをする必要があります:
[Test]
public void Should_not_convert_from_prinergy_date_time_sample2()
{
//Arrange
string testDate = "20121123120122";
//Act/Assert
Assert.Throws<FormatException>(() => testDate.FromPrinergyDateTime());
}
これはひどいことではありませんが、私の意見では、Act と Assert を混乱させます。(明らかに、この単純なテストの場合、理解するのは難しくありませんが、大規模なテストではより困難になる可能性があります)。
私は同僚に、Assert.Throws
完全に取り除き、次のようなことをするよう提案してもらいました。
[Test]
public void Should_not_convert_from_prinergy_date_time_sample3()
{
//Arrange
int exceptions = 0;
string testDate = "20121123120122";
//Act
try
{
testDate.FromPrinergyDateTime();
}
catch (FormatException) { exceptions++;}
//Assert
Assert.AreEqual(1, exceptions);
}
ここでは、厳密な AAA 形式に固執しますが、さらに肥大化を犠牲にします。
そこで、私の質問は AAA スタイルのテスターに向けて出されます: 私がここでやろうとしているような、ある種の例外検証テストをどのように行いますか?