Skip to content

Instantly share code, notes, and snippets.

@them0nk
Created March 23, 2012 03:39
Show Gist options
  • Save them0nk/2166525 to your computer and use it in GitHub Desktop.
Save them0nk/2166525 to your computer and use it in GitHub Desktop.
Rspec Rails cheatsheet (include capybara matchers)
#Model
@user.should have(1).error_on(:username) # Checks whether there is an error in username
@user.errors[:username].should include("can't be blank") # check for the error message
#Rendering
response.should render_template(:index)
#Redirecting
response.should redirect_to(movies_path)
#Capybara Matchers
response.body.should have_content("Hello world")
response.body.should have_no_content("Hello world")
response.body.should have_css("input#movie_title")
response.body.should have_css("input#movie_title", :value => "Twelve Angry Men")
response.body.should have_css("input", :count => 3) #True if there are 3 input tags in response
response.body.should have_css("input", :maximum => 3) # True if there or fewer or equal to 3 input tags
response.body.should have_css("input", :minimum => 3) # True if there are minimum of 3 input tags
response.body.should have_css("input", :between => 1..3) # True if there 1 to 3 input tags
response.body.should have_css("p a", :text => "hello") # True if there is a anchor tag with text hello
response.body.should have_css("p a", :text => /[hH]ello(.+)/i)
# True if there is a anchor tag with text matching regex
response.body.should have_xpath("//a")
response.body.should have_xpath("//a",:href => "google.com")
response.body.should have_xpath("//a[@href => 'google.com']")
response.body.should have_xpath("//a[contains(.,'some string')]")
response.body.should have_xpath("//p//a", :text => /re[dab]i/i, :count => 1)
# can take both xpath and css as input and can take arguments similar to both have_css and have_xpath
response.body.should have_selector(:xpath, "//p/h1")
response.body.should have_selector(:css, "p a#movie_edit_path")
# For making capybara to take css as default selector
Capybara.default_selector = :css
response.body.should have_selector("input") #checks for the presence of the input tag
response.body.should have_selector("input", :value =>"Twelve Angry Men") # checks for input tag with value
response.body.should have_no_selector("input")
# For making capybara to take css as default selector
Capybara.default_selector = :xpath
response.body.should have_selector("//input") #checks for the presence of the input tag
response.body.should have_selector("//input", :value =>"Twelve Angry Men") # checks for input tag with value
# To access elements inside form
response.body.should have_field("FirstName") # checks for presence of a input field named FirstName in a form
response.body.should have_field("FirstName", :value => "Rambo")
response.body.should have_field("FirstName", :with => "Rambo")
response.body.should have_link("Foo")
response.body.should have_link("Foo", :href=>"googl.com")
response.body.should have_no_link("Foo", :href=>"google.com")
@pawelkrol
Copy link

Hash rocket is not a valid XPath symbol (it leads to "Invalid expression" exception). Please use an "equals" sign: it should be "//a[@href = 'google.com']" instead of "//a[@href => 'google.com']".

@islador
Copy link

islador commented Sep 6, 2013

This is a life saver, can I give you Karma or something?

@gigiJackson
Copy link

This is useful, thanks!

However, regarding response.body.should have_css("input#movie_title", :value => "Twelve Angry Men"), :value is not actually a valid key for have_css, and :text doesn't actually match against the value attribute of input fields I've found.

You can either do something like have_css("input#movie_title[value=\"Twelve Angry Men\"]"), or user the have_field and :with key.

@xanhast
Copy link

xanhast commented Nov 20, 2013

Is there a difference between should have_no_link("Foo", :href=>"google.com") and should_not have_link("Foo", :href=>"google.com")?

@nerdinand
Copy link

Thanks a lot for this! I have corrected a few typos in my fork of this gist. Maybe you want to incorporate them: https://gist.github.com/nerdinand/7787825

@Vadorequest
Copy link

Really useful, thanks a lot!

@JasonY1
Copy link

JasonY1 commented Apr 16, 2014

Thank you for making this!

@rmswimkktt
Copy link

Nice cheetsheet. I user this sheet.thx.

@plucb
Copy link

plucb commented Feb 15, 2015

Is it still up-to-date with current capybara version?

@danieljohnmorris
Copy link

This works but using page.should instead of response.body.should

@AlexanderFisenko
Copy link

You'd better use the new :expect syntax like expect(page).to have_

@bunnymatic
Copy link

With capybara 2.4.4, if you want to find a field with a value, use the following

  expect(page).to have_field("My Field", with: "the value in the field")

@kirbyfern
Copy link

Hey I just started learning RSpec is there a tutorial while using these awesome cheatsheets?

@togiberlin
Copy link

Hi, this Gist is outdated - it still uses the "should" syntax.
In newer versions of Capybara, it was replaced by the "expect" syntax.

@redrick
Copy link

redrick commented Aug 14, 2017

Hey, so with expect syntax and couple things that work different, hopefully helpful :)

https://gist.github.com/redrick/01a0ca575a99f264f1d8ab6a4c93cff0

(I was working from nerdinand fork)

@brookjordan
Copy link

Line 44 should be:
# To pass xpath as the default selector type

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment