20

我真的很喜欢 RSpec 能够分离控制器和视图测试的方式,但是在让 capybara 匹配器在视图测试中工作时遇到了一些问题。我基本上试图实现的是这样的:

describe "some page" do
  it "should render with lots of stuff" do
    assign ..
    render
    rendered.should have_button ('Any button') #or any capybara matcher, really
  end
end

我在网上看到了一些帖子,展示了如何配置 capybara 和 rails3 以与 cucumber 或 rspec 控制器测试顺利工作,但这并不是我真正想要的——也就是说,在可能的最低级别测试视图。

此外,如果有另一种方法来做到这一点(不需要大量自定义代码,因为我知道我可以编写一些匹配器,从使用 nokogiri 或任何合适的工具渲染中提取给定的选择器),那也很好 - 使用 capybara 不是必需的.

4

7 回答 7

18

现在可以选择在测试控制器(以及视图)时使用 Capybara 匹配器(没有 Webrat 包)。我这样使用它:

describe GlobalizeTranslationsController do

  render_views
  let(:page) { Capybara::Node::Simple.new(@response.body) }

  describe "PUT :update" do
    before do
      put :update
    end

    it "displays a flash notice" do
      page.should have_selector('p.notice')
    end

  end

end

完整代码:

参考:

于 2011-08-05T14:04:23.363 回答
11

Capybara 目前不适用于视图规范(有计划在未来使其工作)。最简单的答案是添加gem 'webrat'到 Gemfile 中,您基本上就设置好了。您可能没有,have_button但您将拥有have_selector,have_tag和类似的可用。

顺便说一句:据我所知,capybara 和 webrat 可以在一个项目中共存。

于 2011-03-10T12:01:42.433 回答
9

比 Pawel 的答案略简单,但要点是一样的;以下适用于我的 rails 3.1.0、rspec 2.6.0、capybara 1.1.1:

page = Capybara::Node::Simple.new( rendered )
page.should have_content( "blah" )
于 2011-11-10T21:05:51.623 回答
3

你不能在 上调用 capybara 的方法rendered,那只是一个字符串。您可以使用Capybara 的字符串方法来包装renderedCapybara 节点。然后,您可以在该节点上调用 Capybara 的方法:

describe "some page" do
  it "should render with lots of stuff" do
    assign ..
    render
    Capybara.string(rendered).should have_button('Any button')
  end
end

有关更多信息,请查看此帖子:

http://www.tamingthemindmonkey.com/2011/11/07/capybara-matchers-and-scoping-in-view-specs

于 2013-03-21T13:11:59.300 回答
1

在此页面的底部,在“Webrat 和 Capybara”部分,看起来 Capybara 不支持 rspec 视图规范

http://relishapp.com/rspec/rspec-rails

于 2011-01-23T09:04:03.060 回答
1

自从添加了大多数其他答案以来,随着事情发生了变化,更新了这个旧问题:

Capybara 现在确实支持视图规范(开箱即用),这记录在Capybara 的 master 分支上。

引用文档:

最后,视图规范支持 Capybara 匹配器:

RSpec.describe "todos/show.html.erb", type: :view do
  it "displays the todo title" do
    assign :todo, Todo.new(title: "Buy milk")

    render

    expect(rendered).to have_css("header h1", text: "Buy milk")
  end
end

let(:page)在早期版本中似乎已经添加了对这些没有额外样式代码的支持。(它在 capybara 2.4.4 和 2.2 中为我工作)。
另请注意,仅支持有限的匹配器子集;但是,您可以使用Capybara.string获得更多功能;前任:

expect(Capybara.string(rendered).first('td')).to have_no_content 'Tom Riddle'
于 2015-08-24T01:56:02.487 回答
0

您还可以使用 capybara 语法

describe "some page" do 
  it 'should render hello with name' do
    assign(:user, double("User", first_name: "John"))
    render
    expect(rendered).to have_content("Hello John")
  end
end
于 2014-05-20T17:42:54.513 回答