MSTEST0006:避免 [ExpectedException]
属性 | 值 |
---|---|
规则 ID | MSTEST0006 |
标题 | 避免 [ExpectedException] |
类别 | 设计 |
修复是中断修复还是非中断修复 | 非中断 |
默认为启用 | 是 |
默认严重性 | 信息 |
引入版本 | 3.2.0 |
是否存在代码修补程序 | 是,从 3.7.0 开始 |
原因
使用 [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
有关详细信息,请参阅 如何取消代码分析警告。