在相同范围内的beforeEach块是否按顺序运行?

时间:2016-03-21 18:38:06

标签: javascript jasmine

我很确定我在某个地方看过这个,但我现在找不到文档。如果我在同一beforeEach块中有两个describe块,是否保证按顺序运行? IE:

describe("foo", function(){
  beforeEach(function(){
    print("I'm always first!");
  }

  beforeEach(function(){
    print("I'm always second!");
  }
}

2 个答案:

答案 0 :(得分:2)

如果你看一下Suite.js中Jasmine的源代码,它会按照与添加它们相反的顺序添加它们。

Suite.prototype.beforeEach = function(fn) {
    this.beforeFns.unshift(fn);
};

然后在Env.js中你可以看到它们在运行之前它们是相反的:

var beforeAndAfterFns = function(suite) {
  return function() {
    var befores = [],
      afters = [];

    while(suite) {
      befores = befores.concat(suite.beforeFns);
      afters = afters.concat(suite.afterFns);

      suite = suite.parentSuite;
    }

    return {
      befores: befores.reverse(),
      afters: afters
    };
  };
};

因为整个时间都保存在Array中,我会说是的,它们一直是按顺序执行的。

答案 1 :(得分:1)

来自http://jasmine.github.io/2.0/introduction.html

  

可以嵌套调用描述,并在任何级别定义规范。这允许将套件组合为功能树。 在执行规范之前,Jasmine按顺序执行每个beforeEach函数执行的树。执行规范后,Jasmine同样会遍历afterEach函数。

以下是我当前应用的示例代码。

nodeApp是主要模块

describe("\n\nuser registration form testing", function() {

    beforeEach(module("views/createuser/createuser.html"), function() {

    });

    describe("\n\nUser createtion form should have valid data", function() {
        beforeEach(module("nodeApp"));  
        beforeEach(inject(function($rootScope, $compile, $controller, $templateCache) {

        }))

    });    
});

如果我将beforeEach(module("nodeApp"));放在second beforeEach之后 它抛出一个错误。因为nodeApp是负责注入所有服务的模块。 因此,稍后它可以在第二个beforeEach

中进行注射