[英]Mocha async callback and Sequelize promise are not synchronize?
我正在用mocha和它的hook beforeEach
編寫測試用例,它使用sequelize.drop
和sequelize.sync
刪除並重新創建所有表。
exports.deleteAll = function () {
return sequelize.drop({logging: false, cascade: true}).then(function() {
return sequelize.sync({logging: false});
});
};
(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.