如何在测试 headers 之前确保请求已完成?

How to ensure that request has completed before testing headers?

我正在尝试测试当用户单击 link 时会下载 PDF 文件。

it 'downloads a PDF', :js do
  find("a.btn", text: %r{Download}i).trigger 'click'
  expect( page.response_headers['Content-Type'] ).to eq "application/pdf"
end

失败

expected: "application/pdf"
got: "text/html; charset=utf-8"

如果我在期望前加上sleep 20,测试就通过了。

有没有更好/更有效的写法?

出于某种原因,以下内容间歇性通过(即使等待时间更长):

expect( page.response_headers['Content-Type'] ).to have_text("application/pdf", wait: 20)

have_text 是一个使用页面元素 (Capybara::Node::Element) 的匹配器。当您将它与字符串一起使用时,字符串会被解析为 HTML 文档,然后比较该文档中的文本节点,但不会有任何重试行为,因为它不知道如何重新加载字符串(页面元素存储用于在对象中查找它们的查询,以便可以重新加载它们 - 字符串不会)。为了在 response_headers 的字符串上获得等待行为,您需要使用某种匹配器来获取块并重试。 https://github.com/abotalov/waiting_rspec_matchers 是提供此类功能的 gem,但还有一些其他功能。