【发布时间】:2016-03-08 16:44:59
【问题描述】:
我正在使用 should.js 框架 (v8.2.x) 进行单元测试,并且一直在玩一些非常基本的测试。但是,我在测试失败时遇到了这个问题,这让我很困惑。
我定义了这个虚拟函数来测试,add:
var add = function(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('One of the arguments is not a number');
}
return +a + +b
};
现在这是我的虚拟测试:
should.equal(add('1', '1'), '2'); // passes
add('1', '1').should.equal('2') // fails!
现在根据他们的github、should(something) 和something.should 通常返回相同的东西,但没有关于差异的额外信息。
根据他们的API documentation,should.equal 与assert.equal 相同。但是这个测试对我来说通过了:
assert.equal(add('1','1'), '2'); // passes
所以我有三个问题:
- 为什么
add('1', '1').should.equal('2')不通过? - 为什么 should 的两种用法会产生不同的结果?
- 为什么文档说
should.equals与assert.equals相同,但实际上它们的行为不同?
【问题讨论】:
-
我猜一个使用
==,另一个使用===。add函数返回Number,您将其与string进行比较。也许正在执行的类型强制不同?如果你改为add('1', '1').should.equal(2)会发生什么? -
@ChrisTavares 所说的,每当您处理测试数字与字符串时,您都必须检查测试的执行方式,我会假设测试将返回
'11'为'1' + '1',但显然它是不是很字面。 -
@ChrisTavares 是的,
equals应该在 javascript 中使用==和1 == '1'。还有strictEquals使用===。add('1', '1').should.equal(2)确实通过了。 @brod 如果您查看add,我正在使用一元+运算符将它们强制转换为数字。= -
你确定吗?检查文档和源代码。
.should.equal(2)通过的事实似乎表明它正在执行严格的相等检查。 -
完全是我的问题...文档还说
should.equal与assert.equal相同,我已经测试为 utnrue。
标签: javascript equals should.js