TDD:您为单元测试公开了哪些方法?

Yuv*_*dam 16 testing tdd unit-testing

TDD的一个方面我从未完全理解.

假设有人要求您实现一个简单的Stack对象.如果您已经正确完成了设计,那么您将获得一个非常简洁的API.假设:push(),pop()和isEmpty().除此之外的任何事情都会过度消耗需求,并让用户有太多空间来捣乱您的代码.

所以现在让我们假设您要对代码进行单元测试.如果您所有的公共方法都只是上面显示的三个方法,那么您如何做到这一点?到目前为止,这些方法只会进行测试.

因此,要么添加私有方法,它们根本不会帮助您,因为它们对您的单元测试用例不可见.或者你将这些方法公之于众,那就是你努力工作的简约API.现在用户将要乱用你的堆栈,肯定会出现错误.

您如何处理打开公共测试方法与干净简单API的这种困境?

编辑:只是为了指向正确的方向,获得技术指针(例如"使用此hack来暴露私有方法"等等)会很高兴但是我对更通用的答案更感兴趣这两个概念更重要,以及您如何处理这个主题.

Ste*_*owe 14

  1. 测试功能; 这通常意味着测试公共接口 - 因为不应该通过公共接口访问所有功能吗?如果他们不是,那么他们不是功能!可能有例外,但我想不出任何.

  2. 测试公共接口; 任何不直接或间接从公共接口调用的方法都是不必要的.它们不仅不需要进行测试,而且根本不需要存在.


Pat*_*ins 6

你应该看一下这个问题:你测试私有方法吗?.

为了不打破封装,我发现私有方法是巨大的,复杂的或重要的,足以需要自己的测试,我只是把它放在另一个类中并在那里公开(Method Object).然后,我可以轻松地测试现在存在于其自己的类中的先前私有但现在公开的方法.