关于javascript:jasmine-在序列所有块之前运行

Jasmine - Running beforeAll blocks in series

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

  • 重置数据库
  • 在数据库中创建讲座
  • 在数据库中创建问题
  • 转到刚刚创建的讲座的页面
  • 等待路由器完成路由
  • 这些异步任务必须连续运行。我不能先进入讲座页面,然后在数据库中创建它。不幸的是,Jasmine中的beforeAll块不会自动连续运行。

    这是我当前的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
      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上找到

    非常感谢您,
    最大


    您在这里:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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我们已经完成了。希望这会有所帮助。


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
      beforeAll(function(done) {
        Fixtures.clearDB(done).then(...
      });

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