We are going to use RSpec plus FactoryGirl to test our site.
First we need to add the gems to our Gemfile:
group :test, :development do gem 'debugger' gem 'rspec-rails' gem 'factory_girl_rails' end
Now bundle and restart the server.
We now need to initialise the spec directory and helpers. We can do this using:
rails generate rspec:install
Next Configure Rails use rspec in the generators. Inside Application.rb, add a config block:
config.generators do |g| g.test_framework :rspec g.integration_tool :rspec end
Now when we run a generator we also get a spec file generated for us as well too.
Generate scaffold Rspec
We are going to create a User scaffold for our blog. Posts will have Users.
Generate the scaffold. Now look in the spec directory. See the spec there?
rails g scaffold user name:String age:Integer
Run rake spec to run the specs. It will tell you if you have any errors and where they are.
Exercise - Use FactoryGirl
The spec we generated creates a user model for us. This is OK, but not very scalable. We might need users in other places. We are going to use Factory Girl to make the Users for us.
Check out the FactoryGirl documentation here:
Now create a User factory. Modify your generated spec to use the factory instead.
Modify the .rspec config file
Edit the .rspec file so it looks like this:
--color --format documentation
You will find the output much easier to read.
Testing a model
Say we have a Product model we want to test. We would first create a file spec/models/product_spec.rb
require 'spec_helper' describe Product do it "can be initialised" it "has a title" end
Running the test would show yellow, as the tests are not yet implemented.
Here I have filled in the initialiser test:
require 'spec_helper' describe Product do before :all do @product = Product.new end it "can be created" do expect(@product).to be_a(Product) end it "has a title" end
Now let’s implement a new feature, a title:
require 'spec_helper' describe Product do before :all do @product = Product.new :arkham end it "can be created" do expect(@product).to be_a(Product) end it "has a title" do expect(@product.title).to be("Arkham") end end
Exercise - Write specs for your application
First have a looks through the Better Specs guide, it is good:
Now, using the generated User specs as a guide, write specs for your scaffold application. You might like to write some specs for your model and Controller. Remember Use FactoryGirl and run your specs often.