Component | version |
---|---|
RubyMine | 5.0(Windows) |
Rails | 3.2.12 |
Rspec | 2.13.0 |
Capybara | 1.1.4 |
Goal
ブログのトップページを表示する。表示する情報はブログの情報のみ。
Setup
-
Tools > Run Rails Generator > controller > blogs show
-
Run > Run > spec
-
テストが走り、ペンディング(黄色)になる
-
Toggle auto-testをオンにする
-
テストを追加する
spec/controllers/blog_controller_spec.rb
# encoding: utf-8
require 'spec_helper'
describe BlogsController do
describe "GET 'show'" do
it "returns http success" do
get 'show'
response.should be_success
end
end
fixtures :blogs
context "fixtureを使った場合:" do
describe "fixtureの1番目のエントリをgetしたとき" do
it "リクエストは成功すること" do
get 'show', id: blogs(:one).id
response.should be_success
end
end
end
end
- 自動でテストが走り、通過する
1st Red
- テストを追加する
spec/controllers/blog_controller_spec.rb
it ":idで指定したブログをロードしていること" do
get 'show', :id => blogs(:one).id
assigns[:blog].should == blogs(:one)
end
-
自動でテストが走り、コケる
-
コードを書く
app/controllers/blog_controller.rb
...
@blog = Blog.find(params[:id])
...
- 自動でテストが走り、コケる
「returns http success」
「Couldn't find Blog without an ID」
- 以下のテストを削除する
spec/controllers/blog_controller_spec.rb
describe BlogsController do
describe "GET 'show'" do
it "does not return http success" do
get 'show'
response.should_not be_success
end
end
end
-
自動でテストが走り、通過する
-
テストをリファクタリングする
spec/controllers/blog_controller_spec.rb
# encoding: utf-8
require 'spec_helper'
describe BlogsController do
fixtures :blogs
context "fixtureを使った場合:" do
before do
@blog = blogs(:one)
get 'show', :id => @blog.id
end
describe "fixtureの1番目のエントリをgetしたとき" do
it "リクエストは成功すること" do
response.should be_success
end
it ":idで指定したブログをロードしていること" do
assigns[:blog].should == blogs(:one)
end
end
end
end
- 自動でテストが走り、通過する
2nd Red
- テストを追加する
spec/controllers/blog_controller_spec.rb
it "blogs/showを描画すること" do
response.should render_template("blogs") # 間違えている
end
-
自動でテストが走り、コケる
-
テストを修正する
spec/controllers/blog_controller_spec.rb
it "blogs/showを描画すること" do
response.should render_template("blogs/show")
end
- 自動でテストが走り、通過する
3rd Red
- Capybara gemを入れる(have_selector関数を使いたい)
Gemfile
gem "capybara", :group => [:development, :test]
-
bundle install
-
テストを追加する
spec/views/show.html.erb_spec.rb
# encoding: utf-8
require 'spec_helper'
describe "blogs/show.html.erb" do
context "fixtureを使った場合:" do
fixtures :blogs
describe "/blogs/showにアクセスしたとき" do
before(:each) do
@blog = assigns[:blog] = blogs(:one)
render(template: "blogs/show")
end
it "ブログの名前を表示すること" do
response.should have_selector('div.blog > h1', :content=>@blog.name)
end
end
end
end
-
自動でテストが走り、コケる
-
コードを書く
app/views/show.html.erb
<div class="blog">
<h1><%=h @blog.name %></h1>
</div>
- 自動でテストが走り、通過する
おしまい。
ブログやってます:PAPA-tronix !