gpt4 book ai didi

swift - 我应该如何在 BDD 中测试值对象类型的 "isEqual"方法?

转载 作者:行者123 更新时间:2023-11-28 06:24:27 28 4
gpt4 key购买 nike

我是 BDD 的新手,甚至是整个测试领域的新手。

在快速编写一个简单的线性代数库时,我正在尝试采用 BDD 实践。所以会有很多值对象类型,比如MatrixVector等。在写代码的时候,我想我还是需要坚持TDD原则(我说的对吗?):

Not writing any single line of code without a failing test

要实现一个值对象类型,我需要使它符合Equatable 协议(protocol)并实现它的== 运算符。这是添加代码,所以我需要一个失败的测试。如何为这种场景编写规范?

有人可能会建议一些方法,例如:

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
}
}

这将是一个丑陋的样板文件,原因有二:

  1. 可能有很多值对象类型,我需要对所有类型重复一遍
  2. 可能有很多情况会导致两个对象不相等。以上面的规范为例,== 的实现如 return lhs.rows == rhs.rows 将通过测试。为了揭示这个“错误”,我需要添加另一个期望,如 expect(matrixWithDifferentColmunCount) != aMatrix。同样,这种重复发生在所有值对象类型上。

那么,我应该如何优雅地测试这个“isEqual”(或 operator==)方法呢?或者我根本不应该测试它吗?


我正在使用 swift 和 Quick用于测试框架。 Quick 提供了一种称为 SharedExample 的机制减少样板文件。但是由于swift是一种静态类型语言,而且Quick的共享示例不支持泛型,所以我不能直接使用共享示例来测试值对象。

我想出了一个 workaround但不要认为它很优雅。

最佳答案

优雅是测试套件的敌人。测试套件很无聊。测试套件是重复的。测试套件不是“干的”。您制作的测试套件越聪明,您越是尝试避免样板,您就越是在测试您的测试基础设施而不是您的代码。

BDD 的规则是先写测试再写代码。这是少量的测试代码,因为它正在测试少量的实时代码;你就写吧。

是的,这可能太过分了,我并不是说您从不使用辅助函数。但是当您发现自己正在重构测试套件时,您需要问问自己测试套件的用途。

附带说明一下,您的测试不会测试它所说的内容。您正在测试相同的构造函数创建 Equal 对象和非相同的构造函数创建非 Equal 对象(原则上是两个测试)。这根本不会测试它是一个值对象(尽管测试它是一件非常好的事情)。这没什么大不了的。不要让测试理念妨碍有用的测试;但最好让您的标题符合您的测试意图。

关于swift - 我应该如何在 BDD 中测试值对象类型的 "isEqual"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382043/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com