使用lambda表达式的测试方法的静态分析CA1811错误

时间:2016-05-31 07:43:12

标签: c# lambda static-analysis

我在编写测试时发现了一个奇怪的Visual Studio静态分析错误。以下代码会在FailCAPassCA两种测试方法上生成CA1811

  

' ClassToTestTests.FailCA()'似乎没有上游公共或受保护的呼叫者。   ' ClassToTestTests.PassCA()'似乎没有上游公众或受保护的来电者。

代码:

using System;
using NUnit.Framework;
using static Namespace.ClassToTest;
using static NUnit.Framework.Assert;

namespace Namespace {
    public static class ClassToTest {
        public static object MethodToTest (object value) => value;
        }

    [TestFixture]
    internal sealed class ClassToTestTests {
        private object value = new object ();

        [Test]
        public static void FailCA () => Throws<ArgumentNullException> (() => MethodToTest (null));

        [Test]
        public void PassCA () => Throws<ArgumentNullException> (() => MethodToTest (value));
        }
    }

如果我评论FailCA或将其代码更改为此类

[Test]
public void FailCA () {
    value = null;
    Throws<ArgumentNullException> (() => MethodToTest (value));
}

然后警告两种方法的消失。因此() => MethodToTest (null)与此有关的接缝。

为所有方法生成警告的任何想法?

1 个答案:

答案 0 :(得分:1)

我在启用所有规则的情况下设置代码分析。也许你有CA1812被抑制,因为它会出现在大多数NUnit测试装置上,因为它们是由框架动态调用的。无论哪种方式:

使用您的代码,我会收到您在问题中列出的2个警告。当我评论出FailCA或使其成为非静态时,我就不会收到这些警告。但是我确实得到了另一个警告:

  

警告CA1812'ClassToTestTests'是一个显然从未实例化的内部类。如果是这样,请从程序集中删除代码。如果此类仅包含静态方法,请考虑添加私有构造函数以防止编译器生成默认构造函数。

因此,原始警告消失的原因是代码分析器已经确定整个类从未实例化并且没有静态方法,因此无需检查是否已调用类中的每个方法。

当您取消注释FailCA时,存在静态方法这一事实意味着它需要检查调用方法,即使它知道该类永远不会被实例化。