问题标题真的说明了一切,但我会尽力澄清事情。假设我有以下对象:
function MyObject() {
this.isAwesome = true;
// Other methods and property
}
var obj = new MyObject();
现在,在针对此对象编写单元测试时,是否应该编写一个测试来确保isAwesome
属性默认为true?或者这是一个太严格的测试?
答案 0 :(得分:4)
如果变量isAwesome
在某种程度上是该类的面向公众的部分,则只编写测试。如果isAwesome
只影响类的行为,请测试该行为。
通常情况下,像 这样的变量应该是该类公共对象部分的一部分。对于干净的代码,最少需要的是变量是私有的并且具有getter和setter函数。测试这些功能。
答案 1 :(得分:1)
看起来像是一个简单的测试,如果isAwesome
为假,如果有重大分歧,为什么不会你写那个测试?
考虑一下 - 假设一个不同的开发人员在6个月后到来并且认为 - "我将更改它以便在构造函数中没有设置属性 - 让客户决定MyObject
是否真棒"。
现在所有希望每个 MyObject
都很棒的代码可能会破坏。你不想知道这样的改变,以便你可以决定它是否是一个有效的改变?
答案 2 :(得分:0)
这取决于构造函数是否能够更改该默认值。我不知道你正在写什么语言,所以我只想说明一下:
function MyObject(stopBeingAwesome) {
this.isAwesome = true;
if (stopBeingAwesome) {
this.isAwesome = false;
}
}
如果是这种情况,那么您可以测试该逻辑。否则,您将单元测试基本语言构造,例如赋值。
单元测试应该测试一个代码单元的合同。也就是说,相同的输入应始终产生相同的输出。在这种情况下,当对象完成构建时,您的合同涉及this.isAwesome
为true
。但是,除非有人更改MyObject
的实施,以便isAwesome
不会true
,否则没有必要对其进行测试。而且,如果有人确实改变了实施,他们也必须修改测试。担心这个级别的回归意味着你担心你的其他测试不会成功测试默认行为,并且你的同事是代码破坏者,他们会毫不犹豫地修改你的构造函数的默认行为,而不会告诉你并且没有运行您的集成测试套件。
看起来我似乎反对回归测试,但是当Jenkins的构建需要20分钟时,你会开始感激你决定不来测试一些东西。