我是BDD的新手,甚至是整个测试世界。我应该如何测试BDD中值对象类型的“isEqual”方法?
我想在快速编写一个简单的线性代数库时采取BDD的做法。所以会有很多的值对象类型,如Matrix
,Vector
等在编写代码时,我想我还需要坚持TDD原则(是吗?):
不写代码的任何一行,而不一个失败的测试
要实现一个值对象类型,我需要使其符合Equatable
协议并执行其==
运营商。这是添加代码,所以我需要一个失败的测试。如何为这种情况编写规范?
一个可以建议像一些方法:
describe("Matrix") {
it("should be value object") {
let aMatrix = Matrix<Double>(rows: 3, cols:2)
let sameMatrix = Matrix<Double>(rows: 3, cols:2)
expect(sameMatrix) == aMatrix
let differentMatrix = Matrix<Double>(rows: 4, cols: 2)
expect(differentMatrix) != aMatrix
}
}
这将是两个原因一个丑陋的样板:
- 可能有大量的值对象类型的,我需要重复所有其中
- 可能有很多情况会导致两个对象不相等。以上述规格为例,
==
的执行如return lhs.rows == rhs.rows
将通过测试。为了揭示这个“bug”,我需要增加一个像expect(matrixWithDifferentColmunCount) != aMatrix
这样的期望。再次,这种重复发生在所有值对象类型上。
那么,我该如何优雅地测试这个“isEqual”(或operator==
)方法呢?或者我不应该测试它?
我正在使用swift和Quick进行测试框架。 Quick提供了一种称为SharedExample的机制来减少样板。但是由于swift是一种静态类型语言,Quick的共享示例不支持泛型,所以我不能直接使用共享示例来测试值对象。
我想出了一个workaround但不认为它是一个优雅的。
这是真的(可悲)。 –