I really like the way RSpec is able to separate controller and view tests but have some problems with getting capybara matchers to work in a view test. What i basically try to achieve is sth like this:
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
I've seen some posts on the net showing how to configure capybara and rails3 to work smoothly with cucumber or rspec controller tests, but this is not really what I want - that is, testing the views at the lowest level possible.
Also if there's another way to do this (not requiring lots of custom code, couse I know i could write some matchers that extract given selectors from rendered using nokogiri or whatever tool suitable) that'd be great too - using capybara is not a requirement.
Updating this old question as things have changed since most of the other answers were added:
Capybara now does support view specs (out of the box) and this is documented on Capybara's master branch.
To quote the docs:
Finally, Capybara matchers are supported in view specs:
Support for these without additional
let(:page)
style code appears to have been added in an earlier version. (It's working for me in capybara 2.4.4 and 2.2).Note also that only a limited subset of matchers are supported; however you can gain more functionality by using Capybara.string; ex:
You can't call capybara's methods on
rendered
, that's just a string. You can use Capybara's string method though to wraprendered
in a Capybara node. Then, you can call Capybara's methods on that node:For more information, check out this post:
http://www.tamingthemindmonkey.com/2011/11/07/capybara-matchers-and-scoping-in-view-specs
You can also use capybara syntax
Slightly simpler than Pawel's answer, but the gist is the same; the following works for me with rails 3.1.0, rspec 2.6.0, capybara 1.1.1:
Capybara currently does not work with view specs (there are plans to make it work in the future). The simplest answer is to just add
gem 'webrat'
to the Gemfile and you're basically set. You might not havehave_button
but you'll havehave_selector
,have_tag
and similar available.Btw: as far as I know capybara and webrat can co-exist in one project.
At the bottom of this page, in the "Webrat and Capybara" section, it looks like Capybara is unsupported for rspec view specs
http://relishapp.com/rspec/rspec-rails