-1

我发现,那个简单的单元测试

    [TestMethod()]
    [ExpectedException(typeof(ArgumentException))]
    public void UT_UU()
    {
    }

给出错误

消息:测试方法没有抛出预期的异常 System.ArgumentException。

我成功地使用 [ExpetedException] 来测试错误消息输出,但是,在单元测试中使用 Assert 对侧变量进行的任何检查都会导致它出现故障。

我可以以某种方式装饰我的测试以避免它吗?还是“政治错误”?

4

2 回答 2

1

[ExpectedException(typeof(ArgumentException))]只有当被测方法生成您指定的类似类型的异常时,您的单元测试才会通过。在您的情况下ArgumentException,它会因您发布的消息而失败。

因此,本质上,您将不得不通过注入该异常来使您的测试方法失败。目前您的测试方法不会抛出预期的异常(它实际上没有执行任何操作)

例如下面的测试方法将通过

[TestMethod()]
[ExpectedException(typeof(ArgumentException))]
public void UT_UU()
{
   throw new ArgumentException();
}
于 2017-09-14T11:57:29.563 回答
1

如果您的测试被隔离到足以只测试一件事,那么在用 ExpectedException 修饰的测试主体中使用 Assert 语句并不能很好地适应模式。如果您遵循“Arrange, Act, Assert”模式,那么 Assert 在这种情况下由 ExpectedExceptionAttribute 本身处理,并且测试本身的最后一行代码将是“Act”,因为它应该导致异常发生。如果您需要了解有关抛出异常的更具体的信息以确保系统满足行为预期,那么我将在测试本身中使用 try/catch 以便能够提供更细粒度的检查:

[TestMethod]
public void UT_UU()
{
    // Arrange
    var subject = new Foo();
    try
    {
        // Act
        subject.Bar();
    }
    catch(ArgumentException ae)
    {
        Assert.AreEqual("my message", ae.Message);
        return;
    }
    catch(Exception e)
    {
        Assert.Fail("Thrown exception was of wrong type"); // would provide more detail here
    }
    Assert.Fail("exception should have been thrown");
}

显然,仅使用 ExpectedException 就很好,因为它可以让您在没有额外噪音的情况下进行非常干净的测试。或者,如果您要重用这种类型的测试,您可以编写 ExpectedException 的派生类,让您指定要检查的其他特征(如消息)而不仅仅是类型。

于 2017-09-14T12:14:03.520 回答