MSTEST0006:避免 [ExpectedException]
属性 | 值 |
---|---|
规则 ID | MSTEST0006 |
标题 | 避免 [ExpectedException] |
类别 | 设计 |
修复是中断修复还是非中断修复 | 非中断 |
默认为启用 | 是 |
默认严重性 | 信息 |
引入版本 | 3.2.0 |
存在代码修补程序 | 否 |
原因
使用 [ExpectedException]
属性进行标记的方法。
规则说明
首选 Assert.ThrowsException
或 Assert.ThrowsExceptionAsync
而不是 [ExpectedException]
属性,因为它会确保只有预期的代码行会引发预期的异常,而不是对测试的整个正文执行操作。 断言 API 还提供更大的灵活性,且允许断言异常的额外属性。
[TestClass]
public class TestClass
{
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))] // Violation
public void TestMethod()
{
// Arrange
var person = new Person
{
FirstName = "John",
LastName = "Doe",
};
person.SetAge(-1);
// Act
person.GrowOlder();
}
}
如何解决冲突
通过调用 Assert.ThrowsException
或 Assert.ThrowsExceptionAsync
来替换 [ExpectedException]
属性的用法。
[TestClass]
public class TestClass
{
[TestMethod]
public void TestMethod()
{
// Arrange
var person = new Person
{
FirstName = "John",
LastName = "Doe",
};
person.SetAge(-1);
// Act
Assert.ThrowsException(() => person.GrowOlder());
}
}
何时禁止显示警告
当方法只有单行代码时,可以安全地抑制此诊断。
[TestClass]
public class TestClass
{
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void TestMethod()
{
new Person(null);
}
}