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