等待原生 ES6 承诺在 Rails 集成测试中解决?
Wait for native ES6 promise to resolve in Rails integration test?
我正在从头编写 Rails 集成套件。该项目使用自定义 Websocket 客户端(和本机 ES6 promise 对象)来实现某些异步行为。
有没有办法在不修改 [=19] 的情况下告诉 Rails 应用程序仍有未解决的承诺,需要等待才能继续测试的下一步 =] 源代码?那里的大部分内容都集中在等待 AJAX 请求完成。这对应用程序的某些部分很有用,但 Websocket 命令独立于 AJAX.
您需要为承诺在解决时产生的任何可见更改设置一个 assertion/expectation(就像您应该为 AJAX 请求做的那样)。因此,如果它向页面添加文本
assert_text('New text that is added') # non-RSpec
expect(page).to have_text('New text that is added') # if using RSpec
或者如果它向页面添加新元素
assert_selector(:css, '#id_of_new_element') # non-RSpec
expect(page).to have_css('#id_of_new_element') # RSpec
等Capybara 提供的 assertions/expectations 将 wait/retry 最多 Capybara.default_max_wait_time 满足其条件,因此如果您告诉它期望承诺将发生的任何变化,它将等待承诺解决在页面中创建。
我正在从头编写 Rails 集成套件。该项目使用自定义 Websocket 客户端(和本机 ES6 promise 对象)来实现某些异步行为。
有没有办法在不修改 [=19] 的情况下告诉 Rails 应用程序仍有未解决的承诺,需要等待才能继续测试的下一步 =] 源代码?那里的大部分内容都集中在等待 AJAX 请求完成。这对应用程序的某些部分很有用,但 Websocket 命令独立于 AJAX.
您需要为承诺在解决时产生的任何可见更改设置一个 assertion/expectation(就像您应该为 AJAX 请求做的那样)。因此,如果它向页面添加文本
assert_text('New text that is added') # non-RSpec
expect(page).to have_text('New text that is added') # if using RSpec
或者如果它向页面添加新元素
assert_selector(:css, '#id_of_new_element') # non-RSpec
expect(page).to have_css('#id_of_new_element') # RSpec
等Capybara 提供的 assertions/expectations 将 wait/retry 最多 Capybara.default_max_wait_time 满足其条件,因此如果您告诉它期望承诺将发生的任何变化,它将等待承诺解决在页面中创建。