你如何测试私有方法?

我正在建立一个拥有一些公共和私人方法的类库。 我希望能够对私有方法进行单元测试(主要是在开发过程中,但对未来的重构可能也有用)。

什么是正确的方法来做到这一点?


如果您使用.net,则应使用InternalsVisibleToAttribute。


如果你想单元测试一个私有方法,可能是错误的。 单元测试(一般来说)意味着测试一个类的接口,这意味着它的公共(和受保护的)方法。 你当然可以“解决”这个问题(即使只是公开方法),但你也可以考虑:

  • 如果你想测试的方法真的值得测试,那么将它移到它自己的类中可能是值得的。
  • 将更多测试添加到调用私有方法的公共方法中,以测试私有方法的功能。 (正如评论员所指出的那样,如果这些私有方法的功能真的成为公共接口的一部分,那么你只应该这样做,如果他们真的执行对用户隐藏的功能(即单元测试),这可能是不好的)。

  • 测试私有方法可能没有用处。 但是,我有时也喜欢从测试方法中调用私有方法。 大多数情况下,为了防止代码重复测试数据生成...

    微软为此提供了两种机制:

    访问器

  • 转到类定义的源代码
  • 用鼠标右键单击类的名称
  • 选择“创建私人配件”
  • 选择应该创建访问者的项目=>您将得到一个名为foo_accessor的新类。 这个类将在编译期间动态生成,并提供所有可用的公共成员。
  • 但是,当涉及原始类的接口更改时,该机制有时难以处理。 所以,我绝大多数时候都避免使用这个。

    PrivateObject类另一种方法是使用Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject

    // Wrap an already existing instance
    PrivateObject accessor = new PrivateObject( objectInstanceToBeWrapped );
    
    // Retrieve a private field
    MyReturnType accessiblePrivateField = (MyReturnType) accessor.GetField( "privateFieldName" );
    
    // Call a private method
    accessor.Invoke( "PrivateMethodName", new Object[] {/* ... */} );
    
    链接地址: http://www.djcxy.com/p/21403.html

    上一篇: How do you unit test private methods?

    下一篇: Unit test naming best practices