semantic_rails_view_helpers/README.md

89 lines
2.1 KiB
Markdown

Make your Rails Capybara testing even faster and more accurate! Looking for hardcoded text strings is for the birds.
A lot of this assumes you're using a form builder to generate forms, like Formtastic. It's faster that way.
## Your Views
It's easier to find things in Capybara tests if you add extra `data` attributes to fields and such.
This gem does that for you if you link to and refer to things in a certain way. If you do, your
tests turn from text blob and CSS selector messes to nice, clean, simple references to objects
and attributes.
### Linking to things
Link to things using `link_to_model`, `link_to_model_action`, `link_to_collection`, and `link_to_route`.
Data attributes will be added that Capybara can then find later, and quickly:
``` haml
#menu
= link_to_route :root
= link_to_collection [ :admin, :users ]
= link_to_model current_user
= link_to_model_action current_user, :edit
```
``` ruby
# finding those things
within '#menu' do
find_semantic_link(:root)
find_semantic_link(:users)
find_object(@user)
find_action(:edit)
end
```
### Form fields
Don't worry about tying your field entry with text labels. It's much easier to look for attributes by name:
``` ruby
find_input(:first_name).set("first name")
find_input(:last_name).set("last name")
set_input(:gender, 'male')
find_submit.click
```
### Attributes
Write out attributes using `attributes_for`:
``` haml
#object
= attributes_for object do |f|
%h2= f.field(:name)
%h3= f.field(:description)
```
Then look for those fields using Capybara! Because you shouldn't care about the DOM, just that your
field is in there:
``` ruby
@object = Object.create!(:name => @name, :description => @description)
visit object_path(@object)
find_attribute(:name, @object.name)
find_attribute(:description, @object.description)
```
You can even make simple tables, a la Active Admin:
``` haml
#object
= attributes_table_for object do |f|
= f.field :name
= f.field :description
```
## Not Finding Things
Sometimes the absence of a thing is just as important as the presence of a thing. Make it easy on yourself:
``` ruby
# selector's not there
dont_find('#user')
```