2

在使用 Jasmine 测试 Meteor 应用程序的某个功能之前,我必须为测试准备不同的东西。因此我使用 beforeAll 块。

  1. 重置数据库
  2. 在数据库中创建讲座
  3. 在数据库中创建一个问题
  4. 转到刚刚创建的讲座的页面
  5. 等待路由器完成路由

这些异步任务必须串联运行。我不能先去讲座页面,然后在数据库中创建它。可悲的是beforeAllJasmine 中的块不会自动连续运行。

这是我当前的代码:

  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 中以漂亮的风格编写这段代码而不会陷入回调地狱?

整个应用的Source Code是开源的,可以在GitHub上找到

非常感谢你,马克斯

4

2 回答 2

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 我们完成了。希望这可以帮助。

于 2015-12-01T20:13:38.937 回答
1

我的一般方法是有一个beforeAll块。

在该块中,使用 Promise API 将所有这些调用链接为 Promise。

  beforeAll(function(done) {
    Fixtures.clearDB(done).then(...
  });

  beforeAll(waitForRouter);
  
  it("....", function() {
    ...
  });

于 2015-12-01T18:53:42.487 回答