c# – 使私有方法公共单元测试…好主意?

主持人注意:这里已经有39个答案(有些已被删除)。在您发布答案之前,请考虑您是否可以添加对讨论有意义的内容。你很可能只是重复别人已经说过的话。

我偶尔发现自己需要在公共类中创建一个私有方法,只是为它写一些单元测试。

通常这是因为该方法包含在类中的其他方法之间共享的逻辑,并且它更整洁地测试逻辑本身,或者另一个原因可能是我想测试在同步线程中使用的逻辑,而不必担心线程问题。

其他人发现自己这样做,因为我不喜欢这样做吗?我个人认为奖金超过了一个公共的方法的问题,它不真正提供任何服务之外的类…

更新

感谢大家的回答,似乎刺激了人们的兴趣。我认为普遍的共识是测试应该通过公共API发生,因为这是一个类将被使用的唯一方式,我同意这一点。我上面提到的几个案例中,我会这样做是不常见的情况,我认为这样做的好处是值得的。

然而,我可以看到每个人的观点,它应该永远不会真的发生。当我考虑一点,我认为改变你的代码,以适应测试是一个坏主意 – 毕竟我认为测试是一种支持工具,并改变一个系统,以支持一个支持工具,如果你愿意,是blatant坏习惯。

最佳答案

Note:
This answer was originally posted for the question 07000 which was merged into this one, so it may be a tad specific to the usecase presented there.

作为一般的声明,我通常都是重构“生产”代码,使其更容易测试。然而,我不认为这将是一个好的呼唤。一个好的单元测试(通常)不应该关心类的实现细节,只是关于它的可见行为。而不是暴露内部栈的测试,你可以测试类返回的页面,按照你期望它在调用first()或last()后的顺序。

例如,考虑这个伪代码:

public class NavigationTest {
    private Navigation nav;

    @Before
    public void setUp() {
        // Set up nav so the order is page1->page2->page3 and
        // we've moved back to page2
        nav = ...;
    }

    @Test
    public void testFirst() {
        nav.first();

        assertEquals("page1", nav.getPage());

        nav.next();
        assertEquals("page2", nav.getPage());

        nav.next();
        assertEquals("page3", nav.getPage());
    }

    @Test
    public void testLast() {
        nav.last();

        assertEquals("page3", nav.getPage());

        nav.previous();
        assertEquals("page2", nav.getPage());

        nav.previous();
        assertEquals("page1", nav.getPage());
    }
}

转载注明原文:c# – 使私有方法公共单元测试…好主意? - 代码日志