Node.js Assert怎么没有notOk()方法?

时间:2016-11-10 04:43:39

标签: javascript node.js unit-testing testing assert

我正在学习使用mochaassert模块在​​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版本?

1 个答案:

答案 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;