mocha/chai 和 ES6 Promise 的奇怪失败断言
Weird failed assertion with mocha/chai and ES6 Promise
我遇到了 ES6 Promise 和一些 mocha/chai 测试的奇怪行为。
考虑到 returns 承诺的以下 foo()
函数,我想测试两件事:
- 它 returns 一个承诺(因此,一个对象)
- 它在失败时抛出一个异常(以及一个对象)。
问题是,下面的测试 expect(..).to.be.an('object')
在这两种情况下都失败了,但是类型 是 object
(用 typeof
检查)。
这是我的代码:
var chai = require('chai');
var expect = chai.expect;
var foo = function (a, b) {
return new Promise(function(resolve, reject) {
if (a < b) {
resolve();
}
else {
throw new Error('failed');
}
});
}
describe('foo function', function () {
it('should return a promise', function () {
var call = foo();
//typeof call: object
expect(call).to.be.defined; //pass
expect(call).to.be.an('object'); //fail
expect(call.then).to.be.a('function'); //pass
});
it('should throw an exception on failure', function () {
return foo().catch(function (e) {
//typeof e: object
expect(e).to.be.defined; //pass
expect(e).to.be.an('object'); //fail
});
})
});
你有什么线索可以解释这个吗?
如果有帮助,这里是 mocha 调用的结果 mocha test.js
foo function
1) should return a promise
2) should throw an exception on failure
0 passing (20ms)
2 failing
1) foo function should return a promise:
AssertionError: expected {} to be an object
at Context.<anonymous> (test.js:34:24)
2) foo function should throw an exception on failure:
AssertionError: expected [Error: failed] to be an object
at test.js:42:23
Chai 使用 type-detect
代替 a/an
,这在输入对象时很聪明(取决于您如何看待它)。
例如:
var type = require('type-detect');
var promise = new Promise(() => {});
console.log( type(promise) ) // 'promise'
所以这将使您的测试通过:
expect(call).to.be.a('promise');
...
expect(e).to.be.an('error');
...
要么,要么使用 .instanceOf()
:
expect(call).to.be.an.instanceOf(Object);
...
expect(e).to.be.an.instanceOf(Error);
...
我遇到了 ES6 Promise 和一些 mocha/chai 测试的奇怪行为。
考虑到 returns 承诺的以下 foo()
函数,我想测试两件事:
- 它 returns 一个承诺(因此,一个对象)
- 它在失败时抛出一个异常(以及一个对象)。
问题是,下面的测试 expect(..).to.be.an('object')
在这两种情况下都失败了,但是类型 是 object
(用 typeof
检查)。
这是我的代码:
var chai = require('chai');
var expect = chai.expect;
var foo = function (a, b) {
return new Promise(function(resolve, reject) {
if (a < b) {
resolve();
}
else {
throw new Error('failed');
}
});
}
describe('foo function', function () {
it('should return a promise', function () {
var call = foo();
//typeof call: object
expect(call).to.be.defined; //pass
expect(call).to.be.an('object'); //fail
expect(call.then).to.be.a('function'); //pass
});
it('should throw an exception on failure', function () {
return foo().catch(function (e) {
//typeof e: object
expect(e).to.be.defined; //pass
expect(e).to.be.an('object'); //fail
});
})
});
你有什么线索可以解释这个吗?
如果有帮助,这里是 mocha 调用的结果 mocha test.js
foo function
1) should return a promise
2) should throw an exception on failure
0 passing (20ms)
2 failing
1) foo function should return a promise:
AssertionError: expected {} to be an object
at Context.<anonymous> (test.js:34:24)
2) foo function should throw an exception on failure:
AssertionError: expected [Error: failed] to be an object
at test.js:42:23
Chai 使用 type-detect
代替 a/an
,这在输入对象时很聪明(取决于您如何看待它)。
例如:
var type = require('type-detect');
var promise = new Promise(() => {});
console.log( type(promise) ) // 'promise'
所以这将使您的测试通过:
expect(call).to.be.a('promise');
...
expect(e).to.be.an('error');
...
要么,要么使用 .instanceOf()
:
expect(call).to.be.an.instanceOf(Object);
...
expect(e).to.be.an.instanceOf(Error);
...