The document discusses RSpec, a behavior-driven development (BDD) framework for testing Ruby code. It describes how RSpec allows writing tests in a natural language style using "should" statements. Examples are provided for different types of RSpec tests, including model, controller, and view tests. Shared examples, custom matchers, and integration with Cucumber for writing tests in a storytelling format are also covered. The document concludes with information on installing and running RSpec and generating reports from test results.
13. Basics
1 describe Something do
2
3 before do
4 @thing = Something.new
5 end
6
7 it 'should behave in some way' do
8 @thing.action.should == 'expected'
9 end
10
11 after(:all) do
12 Something.destroy_all
13 end
14
15 end
14. Model Specs
1 describe Task do
2
3 describe 'validation' do
4
5 before do
6 @task = Task.new(:title => 'test task')
7 end
8
9 it 'should succeed when all attributres are set' do
10 @task.should be_valid
11 end
12
13 end
14
15 end
15. Controller Specs
1 describe TasksController do
2
3 describe 'handling GET /tasks' do
4
5 it quot;should render the 'tasks/index' templatequot; do
6 get :index
7
8 response.should render_template('tasks/index')
9 end
10
12 end
13
14 end
16. View Specs
1 describe 'tasks/index' do
2
3 before do
4 @task = stub_model(Task)
5 assigns[:tasks] = [@task]
6 end
7
8 it 'should render a link to tasks/new' do
9 render('tasks/index')
10
11 response.should have_tag('a[href=?]', new_task_path)
12 end
13
14 end
18. Shared Examples (1)
1 describe 'a secure action', :shared => true do
2
3 describe 'without a logged-in user' do
4
5 it 'should redirect to new_session_path' do
6 do_request
7
8 response.should redirect_to(new_session_path)
9 end
10
11 end
12
13 end
19. Shared Examples (2)
1 describe TasksController do
2
3 describe 'handling GET /tasks' do
4
5 it_should_behave_like 'a secure action'
6
7 # => redirect without logged-in user
8
9 end
10
11 end
24. Stories (Cucumber)
Scenario: Create Task
Given that there are no tasks
When I create task quot;task 1quot;
When I go to the tasks page
Then I should see quot;task 1quot;
25. Stories (Cucumber)
1 Given /^that there are no tasks$/ do
2 Task.destroy_all
3 end
4
5 When /^I create task quot;(.*)quot;$/ do |title|
6 post tasks_url, :task => { :title => title }
7 end
8
9 When /^I go to the tasks page$/ do
10 get tasks_url
11 end
12
13 Then /^I should see quot;(.*)quot;$/ do |title|
14 response.body.should =~ /#{title}/m
15 end