我正在尝试通过使用TDD开发类似于Bit Vector的简单方法来练习TDD。我碰巧正在使用Swift,但这是一个与语言无关的问题。
My BitVector
是一个struct
存储单个的UInt64
,并在其上方提供一个API,可让您将其视为集合。细节无关紧要,但是很简单。高57位是存储位,低6位是“计数”位,它告诉您实际上有多少个存储位存储一个包含的值。
到目前为止,我有一些非常简单的功能:
- 构造空位向量的初始化程序
count
类型的属性Int
isEmpty
类型的属性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
需要的公共成员互相进行有意义的测试。