- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 BDD 的新手,甚至是整个测试领域的新手。
在快速编写一个简单的线性代数库时,我正在尝试采用 BDD 实践。所以会有很多值对象类型,比如Matrix
、Vector
等。在写代码的时候,我想我还是需要坚持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
}
}
这将是一个丑陋的样板文件,原因有二:
==
的实现如 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/
考虑以下代码 OCMockObject *mock = [OCMockObject mockForClass:[NSObject class]]; [[[mock expect] andReturnV
我正在尝试使用 .isEqual 比较两个对象来自 lodash-node 包的方法。即使对象相同,.isEqual返回 false . var _ = require('lodash-node');
LocalDate在 Java 中有两个类似的方法 equals和 isEqual . 它们之间有什么区别?当他们输出不同的结果时? 最佳答案 LocalDate.equals ,像大多数其他人一样
此函数检查两个对象是否具有相同的值: _.isEqual = (a, b) => { const aKeys = Object.getOwnPropertyNames(a) const bKe
const car = new Map([['100','200']]); const bike = new Map([['200','100']]); _.isEqual(car,bike); //
我正在尝试比较两种颜色,但无法得到正确的结果: 这是我的代码: NSLog(@"selfColor = %@",selfColor); NSLog(@"left = %@",left); NSLog(
背景 我有一个由第 3 方库提供的方法,它返回一个 CLBeacons 数组。 - (void)beaconManager:(ESTBeaconManager *)manager didR
Apple 的文档说如果我覆盖 isEqual: 那么我必须覆盖 hash 以确保哈希值对于被认为相等的两个对象应该相同等于: 然后我阅读了关于哈希的文档,下面是其中的一部分: Therefore,
我有一个类叫 Contact; 在Contact中我有(要测试的简单版本,还没有散列) - (BOOL)isEqual:(id)other { if (other == self)
本文整理了Java中java.time.ZonedDateTime.isEqual()方法的一些代码示例,展示了ZonedDateTime.isEqual()的具体用法。这些代码示例主要来源于Gith
我看到 Julia 有 3 种不同的方式 做平等。 == , === , 和 isequal 我应该使用哪个,何时使用? 最佳答案 ===是内在的平等。 在原语上,它是值相等:如果它们具有相同的位级表
在类中定义的方法在其他类中调用时不会被识别为函数。 文件:模型/book.model.ts export class Book { constructor(public title: stri
在类中定义的方法在其他类中调用时不会被识别为函数。 文件:模型/book.model.ts export class Book { constructor(public title: stri
我有一个使用下划线 isEqual 来比较两个 JSON 字符串的问题。目前我在主干中做了一个应用程序,我正在使用 _.isEqual(savedModel.toJSON(),changedModel
我有一个类,我用它来传递带有文本标签的选择器: @interface TableLink : NSObject @property (nonatomic, strong) NSString* name
我有一个烦人的问题,我试图解决它,但它只是没有发生,所以要么我错过了一些愚蠢的东西,要么我做错了。 基本上 id 喜欢检查一个字符串,如果它是 no,则加载空白字符串,如果还有其他内容,则加载真正的字
最近我一直在研究 java8 的新特性,以便更好地理解它们。 当尝试使用 Stream.filter 进行一些操作时,我发现了 Predicate.java 的源代码,在其中我发现了以下 isEqua
我有一个重写 isEqual 方法的人员类: #import "People.h" @implementation People @synthesize name = _name; -(BOOL)is
喜欢 class A :NSObject { let a :Int let b :UIColor } 我不想通过一一比较所有属性来实现 isEqual。如果那样,当我添加另一个属性时,
我有两个自定义 NSManagedObject 类:Notes 和 Tags。 当我覆盖 Tags 类中的 isEqual: 函数时,我收到如下错误消息: 'Class 'Tags' for enti
我是一名优秀的程序员,十分优秀!