MSTEST0006:避免
| Property | Value |
|---|---|
| 规则 ID | MSTEST0006 |
| Title | 避免 [ExpectedException] |
| Category | Design |
| 修复是中断修复还是非中断修复 | Non-breaking |
| 默认已启用 | Yes |
| 默认严重性 | 从 3.10 开始是“警告”,以前是“信息” |
| 引入版本 | 3.2.0 |
| 是否存在代码修补程序 | 是的,从 3.7.0 开始 |
[注意]此分析器不再与 MSTest 4 相关,因为已删除该属性。
Cause
使用 [ExpectedException] 属性进行标记的方法。
规则说明
首选 Assert.ThrowsException 或 Assert.ThrowsExceptionAsync(或 Assert.ThrowsExactly/Assert.Throws 或 Assert.ThrowsExactlyAsync/Assert.ThrowsAsync,如果使用的是 MSTest 3.8 及更高版本)而不是 [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();
}
}
如何解决冲突
将 [ExpectedException] 属性的使用替换为调用 Assert.ThrowsException 或 Assert.ThrowsExceptionAsync(如果使用 MSTest 3.8 及更高版本,则为 Assert.ThrowsExactly/Assert.Throws 或 Assert.ThrowsExactlyAsync/Assert.ThrowsAsync)。
[TestClass]
public class TestClass
{
[TestMethod]
public void TestMethod()
{
// Arrange
var person = new Person
{
FirstName = "John",
LastName = "Doe",
};
person.SetAge(-1);
// Act
Assert.ThrowsExactly(() => person.GrowOlder());
}
}
何时禁止显示警告
当方法只有单行代码时,可以安全地抑制此诊断。
[TestClass]
public class TestClass
{
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void TestMethod()
{
new Person(null);
}
}
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable MSTEST0006
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0006
若要禁用文件、文件夹或项目的规则,请在none中将其严重性设置为。
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0006.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。