我知道在使用 Capybara 的正常功能规范中,我可以做这样的事情:
require "rails_helper"
describe "users/show", type: :feature do
it 'renders a page' do
visit user_path
save_and_open_page
end
end
是否有一种等效的方法可以在视图规范中查看渲染的页面,而不将其标记为功能?即像这样:
require "rails_helper"
describe "users/show", type: :view do
it 'renders a page' do
render
save_and_open_page
end
end
事实上,当我尝试这样做时,我得到了一个
NameError: undefined local variable or method 'save_and_open_page'
。
(我知道我可以查看呈现的字符串,并且这个方法有人在功能规范的类似线程中建议有效 - 如果需要的话我可以编写自己的方法来做到这一点。但似乎可能有是它的一些现有功能吗?)
不,视图测试中没有用于在浏览器中打开“页面”的现有功能。默认情况下,仅 Capybaras 匹配器包含在视图规范中,而不包含其会话方法。这是因为视图规范没有“浏览器”,它只是您的视图模板被渲染并作为字符串返回(没有加载 CSS/JS,没有 cookie,没有真正的会话,没有交互等)。正如您所指出的,如果您确实需要该功能,则可以很容易地将
rendered
字符串保存到文件并加载到浏览器中。
根据您的需求,按照文章
使用水豚查询验证视图中所示的方法,从视图规范中的
Capybara::Node::Simple
字符串创建一个rendered
对象可能就足够了。
摘自文章,您可以这样做:
it "does not render the account link when signed out" do
assign(:current_user, nil)
render partial: "layouts/nav"
doc = Capybara.string(rendered)
expect(doc).to have_no_css("nav a", text: "Account")
end
请注意,这将允许您在 doc 元素上使用 Capybara Finders 方法(例如
#find
):
doc.find('p')