Jasmine - 运行 beforeAll 块串联

Jasmine - Running beforeAll blocks in series

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

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

这些异步任务必须运行串联。我不能先去讲座页面,然后在数据库中创建它。遗憾的是 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

上找到

非常感谢您, 最大值

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

在该块内,使用承诺 API 将所有这些调用链接为承诺。

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

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

给你:

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 我们已经完成了。希望这有帮助。