我正在尝试通过使用TDD开发类似于Bit Vector的简单方法来练习TDD。我碰巧正在使用Swift,但这是一个与语言无关的问题。
My BitVector是一个struct存储单个的UInt64,并在其上方提供一个API,可让您将其视为集合。细节无关紧要,但是很简单。高57位是存储位,低6位是“计数”位,它告诉您实际上有多少个存储位存储一个包含的值。
到目前为止,我有一些非常简单的功能:
- 构造空位向量的初始化程序
count类型的属性IntisEmpty类型的属性Bool- 等于运算符(
==)。注意:这是类似于Object.equals()Java 的值相等运算符,而不是像==Java中的引用相等运算符。
我遇到了一堆周期性依赖关系:
测试我的初始化程序的单元测试需要验证新构造的
BitVector。它可以通过以下三种方式之一进行操作:- 校验
bv.count == 0 - 校验
bv.isEmpty == true - 检查一下
bv == knownEmptyBitVector
方法1依赖
count,方法2依赖isEmpty(它本身依赖count,因此没有用处),方法3依赖==。无论如何,我不能孤立地测试初始化程序。- 校验
测试是否
count需要对某些东西进行操作,这不可避免地会测试我的初始值设定项实施
isEmpty依赖count执行
==依赖count。
我能够通过引入一个私有API来部分解决此问题,该API BitVector从现有的位模式(作为UInt64)构造一个。这使我可以在不测试任何其他初始化程序的情况下初始化值,以便可以向上“引导”。
为了使我的单元测试真正成为单元测试,我发现自己做了很多黑客操作,这使我的产品和测试代码大大复杂化。
您如何解决这些问题?
BitVector是用于单元测试的完美单位大小,可立即解决您的问题,有BitVector需要的公共成员互相进行有意义的测试。