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

min*_*god 6 jestjs testing-library user-event

在需要在多个测试中调用 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
    })
})
Run Code Online (Sandbox Code Playgroud)

但是,我担心这可能会导致并行运行测试出现问题,最好总是这样做:

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
    })
})

Run Code Online (Sandbox Code Playgroud)

任何人都可以解释一下在 beforeEach 中执行此操作并user在测试之间共享 var 是否会导致问题,以及是否最好user在每个单独的测试中获取一个新实例?

有时,Jest 在并行运行测试时似乎有奇怪的行为,我只是试图消除由于对同一对象的多个引用在测试之间相互干扰而导致的所有可能的奇怪来源。

Ken*_*ory 0

在 v14 之前,setup使用默认导出时会被调用。v14 的官方文档建议使用返回实例中的用户事件方法userEvent.setup():

您还可以直接在默认导出上调用 API。这将在内部调用 setup,然后在实例上使用该方法。

其存在是为了简化向版本 14 的过渡并编写简单的测试。建议对 userEvent.setup() 返回的实例使用方法。

此外,使用 userEvent文档编写测试建议在渲染元素之前调用此方法:

我们不鼓励在测试本身之外渲染或使用任何 userEvent 函数 - 例如在 before/after 挂钩中 - 原因在“测试时避免嵌套”中描述。

这背后的逻辑是,让你的测试独立且易于理解,比拥有消除重复测试逻辑的巧妙抽象更有价值。

beforeEach我认为在并行化方面使用 a 没有任何问题,因为 Jest在文件中串行运行describe和阻塞。test只要您beforeEach位于同一个文件中,它就会在每次测试之前运行,并且应该与setup每次测试具有相同的效果,但现在您需要声明一个变量以将其结果存储在更高的范围内,以便可以在每次测试都会把水搅浑(如上面链接的文章中所述)。