簡體   English   中英

Mocha異步回調和Sequelize Promise是否不同步?

[英]Mocha async callback and Sequelize promise are not synchronize?

我正在用mocha和它的hook 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)工作時不工作? 任何想法? 有什么不對?

Mocha在beforeEach中支持promises,因此只需編寫以下代碼:

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

您的deleteAll()函數返回sequelize.sync() ,該函數返回通過this的promise。 我認為上下文將是最后創建的模型,因此當您將函數傳遞給返回的Promise時,該函數將被傳遞最后創建的表。 因此,在情況(A)中,您指定了function()並手動調用了done() ,而沒有將任何args傳遞給done() 但是在情況(B)中,當您將完成傳遞給promise.then() ,最后創建的模型將被傳遞給完成。

要理解我的意思,請考慮以下幾點:

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

相當於

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

用戶將被自動傳遞到console.log()

這樣就done了最后創建的模型,我認為這可能會引起問題。

當您直接通過done ,它將接收deleteAll返回的對象,而摩卡將其視為錯誤,因此它嘗試將JSON.stringify應用於此對象並將其顯示為錯誤,但是JSON.stringify卻無法做到這一點,因此引發您可以看到的異常。 您可以在Mocha::Runnable#run清楚地看到它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM