2017-02-18 45 views
0

我想测试一下,当用户点击一个链接时,下载一个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

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

+0

感谢@Thomas向我介绍waiting_rspec_matchers。非常有用并解决了这个问题!好奇你为什么决定删除自定义方法?这看起来像它有潜力,并避免增加另一个宝石。这不是一个有效的方法吗? –

+1

@AndyHarvey这是一个有效的方法,但我意识到我只是在解释查询部分,仍然需要匹配器部分,它需要更多的方法,并且对于一个简单的答案来说太长/很复杂 - 如果你对这种方法感兴趣,你应该看看Capybara中的TitleQuery和HaveTitle类作为一个很好的起点。 –

相关问题