【问题标题】:Should.js - Inconsistency in equals method should.equalsshould.js - equals 方法中的不一致 should.equals
【发布时间】: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!

现在根据他们的githubshould(something)something.should 通常返回相同的东西,但没有关于差异的额外信息。

根据他们的API documentationshould.equalassert.equal 相同。但是这个测试对我来说通过了:

assert.equal(add('1','1'), '2'); // passes

所以我有三个问题:

  1. 为什么add('1', '1').should.equal('2') 不通过?
  2. 为什么 should 的两种用法会产生不同的结果?
  3. 为什么文档说 should.equalsassert.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.equalassert.equal 相同,我已经测试为 utnrue。

标签: javascript equals should.js


【解决方案1】:

回答您的问题以及您做错了什么。

现在根据他们的 github,should(something) 和 something.should 通常返回相同的东西,但没有关于差异的额外信息。

should(something)something.should 是的,通常相同。但是您使用了 should.equal,文档没有说明它与其他方法的平等性。只是copy ofnode.js 自己的assert.equal

为什么 add('1', '1').should.equal('2') 不通过?

因为文档明确表示它在内部使用 ===。

为什么 should 的两种用法会产生不同的结果?

因为那是不同的方法,没有地方说它应该是平等的。

为什么文档说 should.equals 与 assert.equals 相同,但实际上它们的行为不同?

$ node
> var should = require('.')
undefined
> var assert = require('assert')
undefined
> var add = function(a, b) {
...   if (isNaN(a) || isNaN(b)) {
.....     throw new Error('One of the arguments is not a number');
.....   }
...   return +a + +b
... };
undefined
> should.equal(add('1', '1'), '2');
undefined
> assert.equal(add('1', '1'), '2');
undefined

所以要弄清楚你错了什么:在 should.js 中存在 should.equal(a, b)assert.equal 相同。还存在something.should.equal(other),它在内部使用===(因为存在.eql,它进行深度相等检查),should(somethng).equal(other) 也与something.should.equal(other) 相同(但不适用于标准包装器)。

希望它会说清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多