调用userEvent.setup()在beforeEach() -这是一个好还是坏的模式?



在需要在多个测试中调用userEvent.setup()的测试套件中,有时我会在beforeEach中执行userEvent.setup(),然后在多个测试中引用相同的uservar

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在文件中连续运行describetest块。只要您的beforeEach在同一个文件中,它就会在每个测试之前运行,并且应该在每个测试中具有与setup相同的效果,但是现在您需要声明一个变量来将其结果存储在更高的作用域,以便在每个测试中引用它,这会使水变得混乱(如上面链接的文章所述)。

相关内容

  • 没有找到相关文章

最新更新