MSTEST0051:Assert.Throws 应仅包含单个语句

资产 价值
规则 ID MSTEST0051
标题 Assert.Throws 应仅包含单个语句
类别 Usage
修复是中断修复还是非中断修复 Non-breaking
默认启用 是的
默认严重性 信息
是在版本 中引入的 3.11.0
有修复代码的办法吗

原因

ThrowsThrowsAsyncThrowsExactlyThrowsExactlyAsync委托中的多个语句的调用或包含多个语句。

规则说明

为了确保仅测试预期会引发异常的特定方法调用,传递给 Assert.ThrowsAssert.ThrowsAsyncAssert.ThrowsExactlyAssert.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());
}

何时禁止显示警告

不要禁止显示此规则的警告。 在动作委托中包含多个语句可能导致不清楚正在测试哪项操作,并可能因违反原始意图而通过测试。