2. What exactly is RSpec?
Behavioral Driven Development
(TDD + Domain Driven Design + Acceptance Test-Driven Planning)
RSpec
Given some context -> When some event occurs -> Then I expect some outcome
DHH’s dislike about RSpec
https://twitter.com/dhh/status/472072157821169664
http://brandonhilkert.com/blog/7-reasons-why-im-sticking-with-minitest-and-fixture
3. Basic Structure (Syntax)
Given some context -> When some event occurs -> Then I expect some o
Structure:
Given
RSpec.describe StaticPagesController, :type => :controller do
describe "GET index" do
it "renders the index template" do
get :index
expect(response).to render_template("index")
end
end
end
When
Then
WhenGiven Then
4. RSpec with Ruby
#1: $ gem install rspec
#2: Inside project folder: $ rspec —init
and set up like this
#3: spec/spec_helper.rb >
require_relative '../car'
#4: spec/car_spec.rb >
require 'spec_helper'
describe Car do
before(:each) do
@car = Car.new("Make", "Model", :type)
end
describe "#honk" do
it "returns the correct sound" do
expect(@car.honk).to eq("Ponk ponk")
end
end
#5: $ rspec spec/car_spec.rb -fd
6. RSpec with Rails - 1
Gemfile >
group :development, :test do
gem 'rspec-rails', '~> 3.0'
gem 'factory_girl_rails'
end
group :test do
gem 'faker'
gem 'capybara'
gem 'guard-rspec'
gem 'selenium-webdriver', '~> 2.47.1'
end
$ bundle install
7. RSpec with Rails - 2
$ rails g rspec:install
Delete > test folder
spec/rails_helper.rb >
require 'capybara/rspec'
Install spec files for existing controllers and models >
$ rails g rspec:controller StaticPagesController
$ rails g rspec:model Course
(RSpec generates spec files automatically upon rails g controller/model)
8. RSpec with Rails - Controller Test
# controllers/selfies_controller.rb
require 'rails_helper'
RSpec.describe StaticPagesController, :type => :controller do
describe "GET index" do
it "renders the index template" do
get :index
expect(response).to render_template("index")
end
end
describe "GET about" do
it "renders the about page" do
get :about
expect(response).to render_template("about")
end
end
end
Controller Test
9. RSpec with Rails - Model Test
# spec/models/selfy_spec.rb
require 'rails_helper'
RSpec.describe Selfy, :type => :model do
describe "selfy" do
selfy = FactoryGirl.build(:selfy)
it "has a valid factory title" do
expect(selfy.title).to eq("This is test selfy title")
end
it "has a valid factory description" do
expect(selfy.description).to eq("This is test selfy description")
end
end
Model Test
10. RSpec with Rails
Feature Test with Capybara -1
# spec/features/user_visits_homepage_spec.rb
require "rails_helper"
RSpec.feature "User visits homepage", :type => :feature do
scenario "successfully", :js => true do
visit root_path
expect(page).to have_text("Welcome to Selfie There")
end
end
Capybara
Selenium JS Web Driver
Feature Test
Capybara Cheatsheet:
https://learn.thoughtbot.com/test-driven-rails-resources/capybara.pdf
(OPTIONAL)
11. RSpec with Rails
Feature Test with Capybara -2
# spec/features/user_signs_in_spec.rb
require "rails_helper"
RSpec.feature "User signs in", :type => :feature do
scenario "successfully", :js => true do
user = FactoryGirl.build(:user)
visit "/users/sign_in"
fill_in "Email", :with => user.email
fill_in "Password", :with => user.password
click_button "Log in"
expect(page).to have_text("Signed in successfully.")
end
end
Feature Test
12. Tips and tricks
Know the difference between FactoryGirl.create() and FactoryGirl.build()
If your test says something like email exists
=> $ rake db:test:prepare
Know how fixtures work and maybe use database_cleaner gem to avoid pos
Use guard gem to run automated testing
=> $ guard init and leave the tab open like you are running rails server