茉莉花 - 在系列之前运行

时间:2015-12-01 18:49:20

标签: javascript testing meteor jasmine meteor-velocity

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

  1. 重置数据库
  2. 在数据库中创建讲座
  3. 在数据库中创建问题
  4. 转到刚刚创建的演讲页面
  5. 等待路由器完成路由
  6. 这些异步任务必须串行运行。我不能先进入讲座页面,然后在数据库中创建它。可悲的是,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

    上找到

    非常感谢您提前, 最大

2 个答案:

答案 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() {
    ...
  });