为什么我们不应该将beforeAll(function(){ let foo = 'test' })
替换为let foo = 'test'
?如果第二种方式没问题,那么beforeAll
的目的是什么?
顺便说一句,这里是官方定义:在任何beforeEach函数或任何规范之前,beforeAll函数只对包含它的describe块执行一次。
答案 0 :(得分:6)
在beforeAll
函数范围内,describe
块和普通代码之间存在一些实质性差异。
beforeAll
设置应与afterAll
拆卸相结合。
before*
块中的错误并不重要,并且不会阻止填充规范列表并运行规范。 describe
块中的错误将导致空的规格列表。
before*
和it
块具有this
as the context of current spec,可用作在块之间共享数据的推荐方式。它通常比父范围的普通变量更可取,因为这样就没有交叉污染测试的风险。 describe
函数没有此上下文。但是,这种方法与ES6箭头功能不兼容。
可能有Jasmine助手可以与before*
和it
块一起使用,例如在角度测试中:
beforeAll(fakeAsync(() => {
asyncInitializationThatDoesntNeedDoneCallback();
}));
如果它是一个应该为整个块定义的常量,那么它肯定可以在没有beforeAll
的情况下定义:
describe('...', () => {
const foo = 'test'; // not let
...
});