使用 Jasmine 时,在 beforeAll
block 中添加匹配器与在 beforeEach
block 中添加匹配器有区别吗?
据我所知,它是双向的。但是,我在网上找到的每个文档/教程都使用 beforeEach
。这仅仅是因为 Jasmine 的内置 beforeAll
block 是一个相对较新的功能,还是由于运行测试时的潜在陷阱而避免了?
使用 beforeAll
对我来说更有意义(为什么要多次添加相同的匹配器?),但我想确保我的测试不会出现任何问题。
最佳答案
有两个区别 - 1) 执行顺序,以及 2) 更改持久化的范围。我在工作中花了很多时间在 Jasmine 中进行测试,beforeAll
和 beforeEach
之间的差异总是表现得像它们应该的那样(好吧,除了一个 bug 我帮助他们修复).我发现使用 beforeEach
而不是 beforeAll
的唯一原因是为了避免测试污染。这对于自定义匹配器来说不是问题,因此继续使用 beforeAll
应该没问题。
执行顺序 - 在任何给定的 describe
block 中,顺序如下:
- 它的
beforeAll
- 它的
beforeEach
- 它的第一个嵌套
it
或describe
block (包括它们的设置和拆卸) - 它的
afterEach
- 对于每个额外的嵌套
it
或describe
block ,重复最后三个步骤 - 它的
afterAll
我已经通过测试和来源(如 this)证实了这一点.
范围 - 在 this 上添加的任何变量、属性关键词,spies , 或 custom matchers (如前所述),一旦添加它们的代码被执行,它们将在整个 block (包括嵌套 block )中在给定 block 中持久存在和可访问。例如,如果我在 describe
的 beforeAll
中设置 this.foo
,它可以在那个 describe
中访问> 的 beforeEach
、afterEach
、afterAll
以及 it
和 describe
block 。一旦我离开 describe block ,this.foo
将不再可访问。
关于javascript - Jasmine 自定义匹配器,最重要的是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682153/