摩卡异步回调和Sequelize承诺不同步?

时间:2015-01-20 05:51:37

标签: node.js asynchronous mocha sequelize.js es6-promise

我正在使用mocha及其beforeEach编写测试用例,使用sequelize.dropsequelize.sync删除并重新创建所有表。

LIB / testutils.js

exports.deleteAll = function () {
    return sequelize.drop({logging: false, cascade: true}).then(function() {
        return sequelize.sync({logging: false});
    });
};

测试/控制器/ controllers.js

(A)这确实有效:

var testutils = require("../../lib/testutils");

describe("CRUD Controller", function() {
    beforeEach(function(done) {
        testutils.deleteAll().then(function(){
            done();
        }).catch(function(err) {
            return done(err);
        });
    });

    describe("#read()", function(){
        it("should....", function(done) {
        });
    });
}

(B)这不起作用:

var testutils = require("../../lib/testutils");

describe("CRUD Controller", function() {
    beforeEach(function(done) {
        testutils.deleteAll().then(done).catch(function(err) {
            return done(err);
        });
    });

    describe("#read()", function(){
        it("should....", function(done) {
        });
    });
}

我不明白为什么testutils.deleteAll().then(done)不起作用,第一个测试用例it("should....", function(done)没有等待beforeEach挂钩完成。我得到了TypeError: Converting circular structure to JSON。但是,testutils.deleteAll().then(function(){ done(); })确实有效。

我的问题是为什么(B)(A)工作时无效?任何的想法?有什么不对吗?

3 个答案:

答案 0 :(得分:3)

Mocha支持beforeEach中的promises,所以只需写下代码:

beforeEach(function(){
  return testutils.deleteAll();
});

答案 1 :(得分:1)

您的deleteAll()函数返回sequelize.sync(),返回传递它的承诺this。我认为上下文将是最后创建的模型,因此当您将函数传递给返回的promise时,该函数将被传递给最后创建的表。所以如果(A)你指定了function() 并手动调用done()而不将任何args传递给done()。但是如果(B)将完成传递给promise.then(),则创建的最后一个模型将传递给done。

为了得到我的意思,请考虑以下事项:

  User.create({name: 'aName'}).then(function(user){console.log(user)});

相当于

  User.create({name: 'aName'}).then(console.log);

用户将自动转到console.log()

所以done传递了我认为可能导致问题的最后一个模型。

答案 2 :(得分:0)

当您直接传递done时,它会收到从deleteAll返回的对象,并且mocha会将其视为错误,因此请尝试将JSON.stringify应用于此对象并将其显示为错误,但不知怎的JSON.stringify无法做到,所以它会抛出你能看到的异常。 您可以在Mocha::Runnable#run

中清楚地看到它