我正在学习使用mocha
和assert
模块在Node.js中进行测试。 assert
有以下类型的方法:
assert.equal();
assert.deepEqual();
assert.deepStrict();
assert.strict();
assert.ok(); // Is the value true?
然后有一些对立面:
assert.notEqual();
assert.notDeepEqual();
assert.notDeepStrict();
assert.notStrict();
但有一个缺失...为什么没有notOk()
方法来测试结果值是否为false
?
这让我想到,对于一般的单元测试,我可能缺少一些基本的东西,也许我应该只测试值是否真实而且从不虚假......
目前,我一直在这样做来测试falsey
语句:
assert.ok(!myValue);
你应该这样做吗?同样,为什么不存在notOk()
方法,因为所有其他方法都有not
版本?
答案 0 :(得分:3)
如果您查看文档,则会注意到.ok(value, message)
等同于assert.equal(!!value, true, message)
。这似乎只是一种便利功能。
应该注意的是,虽然该函数被称为ok()
,但这并不意味着它期望代码中的true
值。期待你想要测试真实性的声明。因此,虽然您对!myValue
的使用有效,但我认为编写更合适:
assert.ok(myValue === false);
上述内容在语义上是有道理的,因为你仍在测试你的表达的真实性,恰好你会发现它是假的。包含notOk()
函数意味着一些含糊不清的含义。 不行意味着失败,因此notOk
函数的失败可能看起来有点复杂。
对于具有not
等价物的其他方法,我认为该语言仍然有意义。说notEqual
暗示你是专门针对不平等进行测试的,而notOk
并不是真的有意义。就个人而言,我只是将ok()
全部放在一起,但就其本身而言,无论如何都很模糊。
如果你真的觉得有必要,你也可以简单地编写自己的便利功能。
我认为值得一提的是这是来源:
// 4. Pure assertion tests whether a value is truthy, as determined
// by !!guard.
// assert.ok(guard, message_opt);
// This statement is equivalent to assert.equal(true, !!guard,
// message_opt);. To test strictly for the value true, use
// assert.strictEqual(true, guard, message_opt);.
function ok(value, message) {
if (!value) fail(value, true, message, '==', assert.ok);
}
assert.ok = ok;