如何在 RSpec/Capybara 视图规范中查看渲染的页面?

问题描述 投票:0回答:2

我知道在使用 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'

(我知道我可以查看呈现的字符串,并且这个方法有人在功能规范的类似线程中建议有效 - 如果需要的话我可以编写自己的方法来做到这一点。但似乎可能有是它的一些现有功能吗?)

rspec capybara rspec-rails
2个回答
1
投票

不,视图测试中没有用于在浏览器中打开“页面”的现有功能。默认情况下,仅 Capybaras 匹配器包含在视图规范中,而不包含其会话方法。这是因为视图规范没有“浏览器”,它只是您的视图模板被渲染并作为字符串返回(没有加载 CSS/JS,没有 cookie,没有真正的会话,没有交互等)。正如您所指出的,如果您确实需要该功能,则可以很容易地将

rendered
字符串保存到文件并加载到浏览器中。


0
投票

根据您的需求,按照文章

使用水豚查询验证视图
中所示的方法,从视图规范中的
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')
© www.soinside.com 2019 - 2024. All rights reserved.