c# - NUnit 3.0 和 Assert.Throws

标签 c# unit-testing nunit nunit-3.0

我正在使用 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 风格的测试人员:你们将如何进行某种异常验证测试,就像我在这里尝试做的那样?

最佳答案

我知道您的出发点,尽管我不介意在这种情况下合并 Act/Assert 步骤。

我唯一能想到的是将实际委托(delegate)(此处为 FromPrinergyDateTime)存储到一个变量中作为“act”步骤,然后断言它:

[Test]
public void Should_not_convert_from_prinergy_date_time_sample2()
{
    //Arrange
    string testDate = "20121123120122";

    //Act
    ActualValueDelegate<object> testDelegate = () => testDate.FromPrinergyDateTime();

    //Assert
    Assert.That(testDelegate, Throws.TypeOf<FormatException>());
}

我知道“行动”步骤不是真正行动,而是定义行动是什么。但是,它确实清楚地描述了正在测试的操作。

关于c# - NUnit 3.0 和 Assert.Throws,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33897323/

相关文章:

java - 如何覆盖单元测试中被测试类调用的方法

asp.net - 如何在 ASP.net 核心单元测试项目中模拟 session 变量?

jenkins - 如何使用 Jenkins Pipeline 发布 NUnit 测试结果?

c# - 在 NUnit 测试中获取上下文

c# - TimeZoneInfo ConvertTimeFromUtc 和 ConvertTime 之间的区别

c# - OpenIdConnectAuthenticationHandler : message. 状态为 null 或为空

c# - 如何配置 Web API XML 序列化程序以序列化所有类的只读属性?

c# - 您可以将Elasticsearch “q” querystring参数解析为NEST对象吗?

c# - Mock 的通用方法(Moq 库)验证从未使用任何参数组合调用方法

.net - 将 Nunit 测试添加到现有解决方案的公认做法是什么?