在需要在多个测试中调用userEvent.setup()的测试套件中,有时我会在beforeEach中执行userEvent.setup(),然后在多个测试中引用相同的user
var
let user: UserEvent
beforeEach(() => {
user = userEvent.setup()
})
describe('SomeTests', () => {
it('should test something', async () => {
await user.click(someButton)
...
})
it('should test some other thing', async () => {
await user.click(someButton)
...blahblahblah
})
})
但是,我担心这会导致并行运行测试时出现问题,所以最好总是这样做:
describe('SomeTests', () => {
it('should test something', async () => {
const user = userEvent.setup()
await user.click(someButton)
...blahblahblah
})
it('should test some other thing', async () => {
const user = userEvent.setup()
await user.click(someButton)
...blahblahblah
})
})
谁能解释一下在beforeEach中这样做并在测试之间共享user
变量是否会导致问题,以及在每个单独的测试中获得一个新的user
实例是否更好?
有时Jest在并行运行测试时似乎有奇怪的行为,我只是试图消除所有可能的奇怪来源,因为在测试之间对相同对象的多个引用相互干扰。
在v14之前,在使用默认导出时为您调用setup
。v14的官方文档建议使用userEvent.setup()
返回的实例中的user-event方法:
您也可以直接在默认导出上调用api。这将在内部调用setup,然后在实例上使用该方法。
这个存在是为了简化到版本14的过渡和编写测试。返回的实例上的方法建议使用userEvent.setup()
同样,使用userEvent编写测试文档建议在呈现元素之前调用该方法:
我们不鼓励渲染或使用任何userEvent函数测试本身——例如在before/after钩子中——原因已描述在"避免嵌套">
这背后的逻辑是,让你的测试是自包含的和可理解的,比有聪明的抽象去重复测试逻辑更有价值。
我不认为在并行化方面使用beforeEach
有任何问题,因为Jest在文件中连续运行describe
和test
块。只要您的beforeEach
在同一个文件中,它就会在每个测试之前运行,并且应该在每个测试中具有与setup
相同的效果,但是现在您需要声明一个变量来将其结果存储在更高的作用域,以便在每个测试中引用它,这会使水变得混乱(如上面链接的文章所述)。