摩卡答应测试超时

时间:2018-08-06 17:24:44

标签: javascript node.js testing mocha

我在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秒,并确保诺言得以解决。我是摩卡新手。我在这里想念东西吗?

1 个答案:

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