看了书上的那个例子,其实仔细去理解之后发现很简单的。
我的方法就是将所有的describe块都拆开,拆为it块,beforeAll,beforeEach,afterAll,afterEach,内部的describe块以及其他(console.log等),
首先执行的是:其他,不管是外部describe中的其他还是内部describe块中的其他,总之先将其他全部执行,顺序是从上往下。
第二步:找出it块,以it为中心,从外往内找beforeAll,beforeEach,先执行beforeAll,再执行beforeEach,且一个describe中的beforeAll只执行一遍,只有第一个it块执行前会先执行beforeAll,而其他的it块不会有该步骤;而beforeEach则是每个it块执行前都会先执行beforeEach。
第三步:执行it块中代码;
第四步:以it为中心,从内往外执行afterEach和afterAll,先执行afterEach再执行afterAll,执行顺序与beforeAll及beforeEach相反,这里需要注意的是,beforeAll只在该describe块中的最后一个it执行后才会执行,其他it块不会。
我们来举个简单的例子
describe("Jasmine Executoin Sequence", function() {
beforeAll(function() {
console.log('run beforeAll')
});
beforeEach(function() {
console.log('run beforeEach')
});
console.log('其他');
it("spec1", function() {
console.log('run spec1')
});
it("spec2", function() {
console.log('run spec2')
});
afterAll(function() {
console.log('run afterAll')
});
afterEach(function() {
console.log('run afterEach')
});
});
按照之前说的
1.先执行其他,也就是先输出“其他”
2.然后找第一个it块,先执行beforeAll,再执行beforeEach
3.然后执行it块
4.再运行afterEach,因为还有这个不是最后一个it,所以不执行afterAll
5.找到第二个it块,因为不是第一个it块,所以不执行befoeAll,只执行beforeEach
6.执行第二个it块
7.先执行afterEach,因为是最后一个it块,所以继续执行afterll.
运行结果应该为
其他
run beforeAll
run beforeEach
run spec1
run afterEach
run beforeEach
run spec2
run afterEach
run afterAll
当然如果有嵌套的describe也是按照一样的顺序,由外往内执行即可
下面出一个练习题,大家可以试着推导一下,加深理解
图示(有点粗糙,将就看看),解释一下图中两个describe块,都包含上面所述的函数。
上述方法为我自己总结,若有不对之处,欢迎提出