我正在尝试对具有公共和私有方法的类进行单元测试,并且我想对已设置为私有的特定方法(基础上的受保护抽象)进行单元测试。我不能让方法公开,我不想通过完整的过程来测试这个方法,我只关心这个方法的输入参数和返回符合期望。
我不想公开这个方法,因为这个问题强调:
Making a private method public to unit test it...good idea?
我的问题是,有哪些方法可以测试私有方法,我应该采用哪种技术?为什么?
我已经阅读了这个问题(How do you unit test private methods?),但想知道接受的答案是否仍然是最好的答案,或者在多年后有更好的方法。
如果此问题被视为How do you unit test private methods?的副本,我会在那里添加我的评论并要求更新,请提供建议。
答案 0 :(得分:7)
如果你不能通过公共方法有意义地测试类的私有方法,那么这将表明类的设计有问题。如果很难测试该类,以便您希望分解测试以测试其功能的子集,那么我建议将该类分解为逻辑部分并单独测试它们。
也许您有机会重构代码,以便私有方法成为其他类的公共方法。一个很好的例子是一个类,它安排一些计时器的工作,以便稍后处理。工作方法可能会被实现为私有方法,这使得难以在不调度计时器的情况下以简单的方式进行测试,并等待它执行工作方法。在执行时间非常快的测试中并不理想。解决此问题的一个简单方法是将调度工作代码拆分为两个单独的类。私有工作方法然后成为Worker类的公共方法,使其非常容易测试。虽然拆分调度和工作代码意味着您将难以实现100%的覆盖率,但您至少会覆盖工作代码。解决这个问题的方法是使用Quartz.net之类的东西来实现调度程序类,这样你就可以很容易地对调度程序和工作程序代码进行单元测试。
答案 1 :(得分:2)
我已经阅读过这个问题(你如何对私有方法进行单元测试?)但是 我想知道接受的答案是否仍然是最好的答案 经过多年,有更好的方法。
我会避免接受的答案。
我可以加入关于测试公共界面的长篇大论,而不是担心内部,但这可能不太现实。
我可以看到两个直接选项:
new
提升到相关策略)。然后可以单独测试这个单独的策略项目。那就是说,你不应该经常发现自己处于这种状况。如果你这样做,你需要退后一步,检查你如何设计你的类,并可能审查它们,以使它们更开放和可测试。
答案 2 :(得分:1)
在VS 2005,2008和2010年,您可能拥有私人访问者。右键单击私有函数,然后选择“创建私有访问者”...
在VS 2012中,这个功能已经不见了。唯一方便的方法是使用PrivateObject。您可以查看MSDN以获取使用PrivateObject的示例。
答案 3 :(得分:1)
您是否希望能够在测试中调用您的私有方法,看看它是如何工作的?
您可以从您的类派生并添加将调用您要测试的方法的公共方法。非常简单。虽然我不建议测试私有方法。我想不出单一的理由去做。我很乐意看到会改变主意的例子。
答案 4 :(得分:0)
如果您使用的是VS 2005或更高版本,请使用以下步骤
有关更多信息,请参阅this
它看起来在内部使用反射来调用私有方法。但它确实有效。
答案 5 :(得分:0)
我实际上来到这里是为了回答这个问题,直到我意识到我不应该对私人方法进行单元测试。这样做的原因是因为私有方法是一个过程中的一部分,它是一些更大逻辑的一部分。
单元测试旨在针对类的接口进行测试。我的想法是,当我按照预期的方式使用我的班级时,我应该确保质量控制。因此,单独测试私有方法没有用,只是因为它永远不会暴露给消费者(无论是谁实现)。您需要针对消费者可以使用您的课程的案例进行单元测试。
如果您发现自己绝对需要对私有内容进行单元测试,则可能需要重新考虑该方法的位置,或者您的代码如何分解。我得出的结论是,如果我需要对一个私有方法进行单元测试,那么9/10次它就是一个可以包装到静态实用程序类中的方法。
答案 6 :(得分:-1)
使用反射。如果您不想自己弄乱反射,那么您可以使用位于Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll中的Microsoft的PrivateObject类。但是合作MSTest和NUnit存在问题 - Using both MSTest and NUnit?