在使用Jasmine测试我的Meteor应用程序的某个功能之前,我必须为测试准备不同的东西。因此我使用beforeAll块。
这些异步任务必须串行运行。我不能先进入讲座页面,然后在数据库中创建它。可悲的是,Jasmine中的beforeAll
块不会自动连续运行。
这是我目前的代码:
beforeAll(function(done) {
Fixtures.clearDB(done);
});
beforeAll(function(done) {
Fixtures.createLecture({}, function(error, result) {
lectureCode = result;
done();
});
});
beforeAll(function(done) {
Fixtures.createQuestion({}, done);
});
beforeAll(function(done) {
Router.go('lecturePage', {lectureCode: lectureCode});
Tracker.afterFlush(done);
});
beforeAll(waitForRouter);
it("....", function() {
...
});
如何在不进入回调地狱的情况下以漂亮的风格在Jasmine中编写此代码?
整个应用程序的源代码是开源的,可以在GitHub
上找到非常感谢您提前, 最大
答案 0 :(得分:2)
你在这里:
beforeAll(function(done) {
async.series([
function(callback) {
Fixtures.clearDB(callback)
},
function(callback) {
Fixtures.createLecture({}, function(error, result) {
lectureCode = result;
callback();
});
},
function(callback) {
Fixtures.createQuestion({}, callback);
},
function(callback) {
Router.go('lecturePage', {lectureCode: lectureCode});
Tracker.afterFlush(callback);
}],function(err, results){ // callback called when all tasks are done
done();
});
}
我还没有测试过,但我希望你能有所了解。您需要创建函数列表,每个函数都将提供您需要调用以使下一个函数运行的回调函数。在调用最终回调之后,我们可以调用done()告诉jasmine我们已经完成了。希望这会有所帮助。
答案 1 :(得分:1)
我的一般方法是拥有一个beforeAll
块。
在该块中,使用promise API将所有这些调用链接为promises。
beforeAll(function(done) {
Fixtures.clearDB(done).then(...
});
beforeAll(waitForRouter);
it("....", function() {
...
});