| 资产 | 价值 |
|---|---|
| 规则 ID | MSTEST0051 |
| 标题 | Assert.Throws 应仅包含单个语句 |
| 类别 | Usage |
| 修复是中断修复还是非中断修复 | Non-breaking |
| 默认启用 | 是的 |
| 默认严重性 | 信息 |
| 是在版本 中引入的 | 3.11.0 |
| 有修复代码的办法吗 | 否 |
原因
对Throws作ThrowsAsyncThrowsExactlyThrowsExactlyAsync委托中的多个语句的调用或包含多个语句。
规则说明
为了确保仅测试预期会引发异常的特定方法调用,传递给 Assert.Throws、Assert.ThrowsAsync、Assert.ThrowsExactly 或 Assert.ThrowsExactlyAsync 的操作委托应该只包含一个语句。 如果异常是由不打算引发的语句引发的,则包含多个语句可能会导致通过测试。 如果意图抛出的操作中的语句不是最后一个,那么测试中就有冗余代码。 如果是最后一个语句,则应明确说明意向。
如何修复违规行为
重构测试,以确保动作委托仅包含预期引发异常的语句。 将任何设置代码移到断言调用之外。
例如,更改以下项:
[TestMethod]
public void TestMethod()
{
var obj = new MyClass();
Assert.ThrowsExactly<InvalidOperationException>(() =>
{
obj.Initialize();
obj.Execute(); // Only this should be inside the assertion
});
}
更改为:
[TestMethod]
public void TestMethod()
{
var obj = new MyClass();
obj.Initialize();
Assert.ThrowsExactly<InvalidOperationException>(() => obj.Execute());
}
何时禁止显示警告
不要禁止显示此规则的警告。 在动作委托中包含多个语句可能导致不清楚正在测试哪项操作,并可能因违反原始意图而通过测试。