我正在使用mocha及其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)工作时无效?任何的想法?有什么不对吗?
答案 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