我最近正在查看一个同事代码,我意识到他在describe调用顶部的BeforeAll函数中实现了一个jest函数,然后在beforeEach函数中创建了一个数据对象。这让我想知道,BeforeAll和BeforeEach之间到底有什么区别。
是时候了……我去了Google !!我确实找到了一些文章,这些文章有助于阐明两者之间的某些功能差异。
发现1 :http://breazeal.com/blog/jasmineBefore.html
发现2 :Difference between @Before, @BeforeClass, @BeforeEach and @BeforeAll
考虑到我发现的文章,BeforeAll仅被调用一次。而在每个单独的测试之前调用BeforeEach。太好了!现在,我对何时调用它有了更好的了解!
我还发现,BeforeAll最适合用于初始化代码。这是完全合理的!初始化一次。繁荣,您完成了。
我的困惑是什么时候初始化什么东西,什么时候不初始化?我发现我们代码中的BeforeEach经常被使用。我很好奇的是哪种代码被认为是“初始化”代码,而不是BeforeEach中应该包含什么代码。
下面的代码示例:
beforeAll((done) => {
// Mocking method from within Box file
transferBoxPlanSpy = jest.spyOn(Box, 'transferPlanFromBox').mockImplementation(() => Promise.resolve());
// Pulling data from MongoDB
User.findOne({ user_name: 'testsurgeon1' }, (err, user) => {
user.addMGSPermission();
user.save(done);
});
});
beforeEach(() => {
planData2 = {
user_name: 'hello1',
laterality: 'right',
plan_id: 'testplan42',
order_number: '856-hd-02-l',
file_id: '123456sbyuidbefui',
};
});
我希望我的问题不要太含糊。谢谢您的时间!
编辑1 我想指出的是,这段代码不是我自己编写的,而是由我们软件团队中的一位成员编写的。他将对象放在BeforeEach内部,并将模拟对象放在BeforeAll内部。
我的困惑是,除了少数例外,似乎所有代码都可以放到BeforeAll中。
答案 0 :(得分:0)
两者均用于设置一项或多项测试所需的条件。
如果您确定测试不会对这些条件进行任何更改,则可以使用beforeAll
(它将运行一次)。
如果测试做更改了这些条件,则您需要使用beforeEach
,它将在每次测试之前运行,因此可以为下一个条件重置条件。
除非初始化缓慢或计算量大,否则默认使用beforeEach
可能是最安全的方法,因为它减少了人为错误的机会,即未意识到一个测试正在更改下一个测试的设置。
您显示的示例是结合使用这两个示例的一个很好的例子-缓慢的网络呼叫被放入beforeAll
中,因此它只需发生一次;每次在beforeEach
中都会重置数据对象(可能是由测试修改的)。