是否可以为具有 1)返回类型 void、2)访问说明符私有或受保护的方法编写单元测试?

Posted

技术标签:

【中文标题】是否可以为具有 1)返回类型 void、2)访问说明符私有或受保护的方法编写单元测试?【英文标题】:Is it possible to write a unit test for the method that has, 1)Return type void, 2)access specifier private or protected? 【发布时间】:2014-11-10 11:03:51 【问题描述】:

在经典的 asp.net 中,是否可以为具有 void 返回类型和访问说明符受保护或私有的方法的类编写 Nunit 框架单元测试。让我清楚,因为我是单元测试的初学者。

更新:这是我的 void 函数以防万一,我该如何为此编写单元测试?

        public void function(TextBox txtBox, string Result)
        
            if (Result.Trim().ToString() == " ")
            
                txtBox.Text = "";
            
            else
            
                txtBox.Text = Result;
            
        

【问题讨论】:

是的,两者都可以,但是有些人认为您不应该直接对私有方法和受保护方法进行单元测试,因为它们应该包含在您对公共方法和属性的测试中。 @Ben 你能给我一些这个场景的例子或参考网站吗? 你能添加一个你想要单元测试的类的小例子吗? 在调用 void 方法后,您想检查什么行为?单元测试是关于测试一个单元。这并不意味着(必然)类中的各个私有函数。私有方法组织是您的测试不应该关心的实现细节。你的测试应该关心测试你的单元的行为,而不是它的内部实现 @rene 我用 void 返回类型的单元测试示例场景更新了我的问题。 【参考方案1】:

我想你在问两个问题:

是否可以为具有 void 返回类型的方法的类编写 Nunit 框架单元测试? 有可能,但在某些方面你必须知道在执行方法。例如,如果它抛出异常,则测试失败,否则认为测试成功。此外,如果方法的副作用改变了这些属性,您可以检查其他属性。

是否可以为经典 asp.net 中访问说明符 protected 或 private 的类编写 Nunit 框架单元测试? 对私有和受保护成员进行单元测试并不常见。不过如果需要的话,可以通过反射来完成,不过也可以用internal代替private。在 AssemblyInfo.cs 中,像这样使用 InternalsVisibleTo 属性:

[assembly:InternalsVisibleTo("UnitTestAssembly")]

只有 UnitTestAssembly 类可以访问内部成员。成员对其他类保持隐藏。 UnitTestAssembly 必须是您的单元测试项目/程序集的名称。当程序集是强命名时,这不起作用;在这种情况下,您必须指定更多。 This link 在这种情况下可能会对您有所帮助。

更新:...我如何为此编写单元测试? 在定义了 function 的类中声明一个内部函数:

    internal string GetTextboxText(Textbox txtBox)
    
        return txtBox.Text;
    

现在你可以编写单元测试了:

  ...
  yourClassInstance.function(myTxtBox, "SomeString");
  Assert.IsTrue(yourClassInstance.GetTextboxText(myTxtBox) == "SomeString");
  ...
  yourClassInstance.function(myTxtBox, " ");
  Assert.IsTrue(yourClassInstance.GetTextboxText(myTxtBox) == "");

但是当你指定一个空文本框时会发生什么?

  yourClassInstance.function(null, " "); // Will probably throw exception
  Assert.IsTrue(yourClassInstance.GetTextboxText(myTxtBox) == "");

如何处理?这就是您可以在单元测试中验证的内容。

【讨论】:

以上是关于是否可以为具有 1)返回类型 void、2)访问说明符私有或受保护的方法编写单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

定义 Java 中的方法

九方法的使用

具有 UNNotificationRequest 的计算属性返回无法将类型“Void”的返回表达式转换为返回类型“[UNNotificationRequest]”

void及void指针介绍

递归 - 具有 void 函数返回类型的反向 LinkedList

void 方法的 OCMock 测试