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

时间:2017-02-18 17:10:02

标签: ruby-on-rails rspec capybara poltergeist

我正在尝试测试当用户点击链接时,会下载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)

1 个答案:

答案 0 :(得分:1)

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