我在NodeJS中具有以下测试代码:
'use strict';
// Example class to be tested
class AuthController {
constructor() {
console.log('Auth Controller test!');
}
isAuthorizedAsync(roles, neededRole) {
return new Promise((resolve, reject) => {
return resolve(roles.indexOf(neededRole) >= 0);
});
}
}
module.exports = AuthController;
以及以下摩卡测试代码:
'use strict';
const assert = require('assert');
const AuthController = require('../../lib/controllers/auth.controller');
describe('isAuthorizedAsync', () => {
let authController = null;
beforeEach(done => {
authController = new AuthController();
done();
});
it('Should return false if not authorized', function(done) {
this.timeout(10000);
authController.isAuthorizedAsync(['user'], 'admin')
.then(isAuth => {
assert.equal(true, isAuth);
done();
})
.catch(err => {
throw(err);
done();
});
});
});
会引发以下错误:
1 failing
1) AuthController
isAuthorizedAsync
Should return false if not authorized:
Error: Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (c:\supportal\node_modules\ttm-module\test\controllers\auth.controller.spec.js)
我尝试将默认的摩卡测试超时时间增加到10秒,并确保诺言得以解决。我是摩卡新手。我在这里想念东西吗?
答案 0 :(得分:1)
这里的问题是您没有正确使用mocha async API。要导致done
回调失败,您应该在调用它时将错误作为第一个参数。
按照书面规定,您在then
处理程序中的声明将引发,这将跳过第一个done
调用,并转到catch
处理程序。该catch
处理程序反过来会再次抛出该错误,同样会阻止您到达第二个done
回调。
您得到的是未处理的承诺拒绝,并且没有调用done
,导致了摩卡测试超时,并可能会根据未使用的节点版本发出有关未处理的拒绝的警告消息。 / p>
最快的解决方法是正确使用完成的回调:
it('Should return false if not authorized', function(done) {
authController.isAuthorizedAsync(['user'], 'admin')
.then(isAuth => {
assert.equal(true, isAuth);
done();
})
.catch(err => {
done(err); // Note the difference
});
});
更干净的解决方法是通过返回链接的诺言来使用Mocha的内置诺言支持。这样就无需明确处理故障案例:
it('Should return false if not authorized', function() {
return authController.isAuthorizedAsync(['user'], 'admin')
.then(isAuth => {
assert.equal(true, isAuth);
});
});