[TestMethod]是否必须公开?如果没有,会有什么后果?

时间:2019-02-08 17:42:06

标签: c# unit-testing access-modifiers internalsvisibleto

我正在使用Microsoft.VisualStudio.TestPlatform.TestFramework提供的测试工具。我有一个用[TestMethod]装饰的测试方法。我想使用[DataRow]针对各种参数组合实施此测试。该方法将需要的参数之一是在另一个程序集中声明为内部的枚举类型。定义枚举类型的程序集允许包含单元测试的程序集通过InternalsVisibleTo访问其内部。

据我所知,单元测试方法通常是在公共类中公开的。当涉及到此单元测试方法时,必须无法从单元测试程序集外部访问该测试方法(通过将其设置为私有或内部,或通过将包含该方法的测试类设置为内部)来实现,或者必须将该枚举公开。公开枚举是不合适的,因此将测试方法设置为内部似乎是正确的。

将单元测试方法设为内部是否有可能产生负面影响?

毫无疑问,这个问题很简单,答案很简单。我之所以这样问,是因为我在互联网上寻找答案根本没有成功。我所能找到的只是关于是否应该测试私有方法的讨论。

注意:如果您提出的评论或答案未能回答我的问题,而是暗示或暗示使用InternalsVisibleTo测试程序集的内部成员是错误的,那么我将立即拒绝您的回答。

注释2:在这种情况下,可能要做的一件事情是使用字符串参数而不是enum参数,在测试方法中使用Enum.Parse,然后传递所有相关参数作为使用nameof运算符构造的字符串。我不喜欢这样,但这可能是最糟糕的解决方法。

2 个答案:

答案 0 :(得分:2)

至少对于MSTest,Visual Studio中的测试运行程序不会检测到运行时不公开的方法。这是一个简单的示例。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1() => Assert.IsTrue(true);

    [TestMethod]
    internal void TestMethod2() => Assert.IsTrue(false);
}

结果是检测到,运行并通过了一项测试。因此,我认为这对不公开测试方法会产生重大负面影响。

答案 1 :(得分:1)

[TestMethod] s必须具有public访问权限。 Here的Microsoft在此问题上的文档。

结果是如果private,它将无法运行。