在Jasmine中,beforeAll()和let之间有什么区别吗?

时间:2016-07-25 10:29:00

标签: javascript jasmine ecmascript-6

我已经尝试过这样思考,阅读SO问题并且我已经创建了一个小测试:

describe("let", () => {
  let x = 1;
  it("",function() {
    console.log(x + "<< it");
    console.log(y + "<< it");
  });
});

describe("beforeAll()", () => {
  let x;
  let y = 2;
  beforeAll(() => {
    x = 1;
  });
  it("",function() {
    console.log(x + "<< it");
    console.log(y + "<< it");
  });
});

输出如下:

LOG: '1<< it'
LOG: 'undefined<< it'
LOG: '1<< it'
LOG: '2<< it'

这对我来说意味着beforeAll()和let都是作用于包含函数的范围,并且在运行任何包含的it之前运行。使用let(实际上var)我对JavaScript范围的理解使得结果涉及到预期。

这不会发生在RSpec中,其中y将在第一次测试中定义,因为描述是在it之外运行的。 (这是我要问的主要原因,我希望尽可能清理不必要的代码,因为let更清洁,而不是让RSpec宿醉导致不必要的冗长。)

那么beforeAll()let之间是否存在任何我不知道的差异(我的测试/理解中的缺陷可能会混淆)?

1 个答案:

答案 0 :(得分:1)

beforeAll回调可以访问规范this,并且可以是异步的。

如果规范中未使用this上下文,我建议您使用let / const表示常量,beforeAll表示设置操作(可以是可选择与afterAll配对。