如何等待按钮的侦听器在 javascript 中解析?
How to await button's listeners to resolve in javascript?
我正在 Jest 使用 jsdom
环境进行前端测试,这让我可以模拟 DOM 树和手动调用 button.click()
.
之类的东西
我想实现的是await button.click()
,我想这应该等待所有按钮的听众来解决他们的承诺,但不幸的是它不是那样工作的。
我们以这段代码为例:
class Test {
constructor() {
const button = document.getElementById('button');
button.addEventListener('click', async () => this.fetch());
}
async fetch(): Promise<void> {
await this.sleep();
}
sleep() {
return new Promise(resolve => setTimeout(resolve, 2000))
}
}
现在假设我有一些异步 Jest 测试,我正在手动调用 button.click()
期望它等待 2000 毫秒:
async fun(): Promise<void> {
const button = document.getElementById('button');
await button.click(); //I expect this await to sleep for 2000ms but it resolves instantly
}
我认为这里的问题是你必须在这里添加 await:
constructor() {
const button = document.getElementById('button');
button.addEventListener('click', async () => await this.fetch());
}
据我所知,环境不会等待您的事件侦听器完成。火了就忘了。
相反,让我们退后一步。测试内容是什么?你想测试前端的某个变化吗?例如:如果有某种加载指示器,您可以测试 DOM 中是否存在加载指示器,而不是测试 class / 代码的内部工作。
关于 jest、reactjs 和@testing-library/react 的示例可能如下所示。
// render the DOM
const { getByRole, getByText } = render(
<App />
)
const button = getByRole("button", { name: "Submit" })
// click the button
button.click()
// wait till the text appears within the DOM
await waitFor(() => {
getByText("Successfully submitted!")
})
其中waitFor是这里的关键函数。如果提供的回调成功,它会定期检查。只有 waitFor 完成,测试才会继续。
请注意,该示例使用的是 reactjs,但在它的核心中,这个 post 是关于在 DOM 中等待信号的想法,而不是关于某个库。
但我可能走错了路,如果有的话,请随时提供更多信息。
我正在 Jest 使用 jsdom
环境进行前端测试,这让我可以模拟 DOM 树和手动调用 button.click()
.
我想实现的是await button.click()
,我想这应该等待所有按钮的听众来解决他们的承诺,但不幸的是它不是那样工作的。
我们以这段代码为例:
class Test {
constructor() {
const button = document.getElementById('button');
button.addEventListener('click', async () => this.fetch());
}
async fetch(): Promise<void> {
await this.sleep();
}
sleep() {
return new Promise(resolve => setTimeout(resolve, 2000))
}
}
现在假设我有一些异步 Jest 测试,我正在手动调用 button.click()
期望它等待 2000 毫秒:
async fun(): Promise<void> {
const button = document.getElementById('button');
await button.click(); //I expect this await to sleep for 2000ms but it resolves instantly
}
我认为这里的问题是你必须在这里添加 await:
constructor() {
const button = document.getElementById('button');
button.addEventListener('click', async () => await this.fetch());
}
据我所知,环境不会等待您的事件侦听器完成。火了就忘了。
相反,让我们退后一步。测试内容是什么?你想测试前端的某个变化吗?例如:如果有某种加载指示器,您可以测试 DOM 中是否存在加载指示器,而不是测试 class / 代码的内部工作。
关于 jest、reactjs 和@testing-library/react 的示例可能如下所示。
// render the DOM
const { getByRole, getByText } = render(
<App />
)
const button = getByRole("button", { name: "Submit" })
// click the button
button.click()
// wait till the text appears within the DOM
await waitFor(() => {
getByText("Successfully submitted!")
})
其中waitFor是这里的关键函数。如果提供的回调成功,它会定期检查。只有 waitFor 完成,测试才会继续。
请注意,该示例使用的是 reactjs,但在它的核心中,这个 post 是关于在 DOM 中等待信号的想法,而不是关于某个库。
但我可能走错了路,如果有的话,请随时提供更多信息。