如果您的测试被隔离到足以只测试一件事,那么在用 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 的派生类,让您指定要检查的其他特征(如消息)而不仅仅是类型。