【发布时间】:2016-02-27 02:39:15
【问题描述】:
我正在使用 NUnit 3.0 编写一些单元测试,与 v2.x 不同,ExpectedException() 已从库中删除。
根据this 的回答,我绝对可以看到试图捕捉具体在测试中的哪个位置期望他们的系统抛出异常(而不是仅仅说“在测试中的任何位置”)的逻辑。
但是,我倾向于对我的 Arrange、Act 和 Assert 步骤非常明确,这使其成为一项挑战。
我曾经做过这样的事情:
[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 风格的测试人员:你会如何像我在这里尝试做的那样进行某种异常验证测试?
【问题讨论】:
-
当被测方法没有参数时,Assert 可以这样简化: Assert.Throws
(testDate.FromPrinergyDateTime) 或 Assert.That(testDate.FromPrinergyDateTime, Throws.TypeOf () ); -
第二部分在我看来没有那么臃肿?
标签: c# unit-testing nunit nunit-3.0