2009/12/16

Ruby on Rails で RSpec を使うときのメモ

参考

vender/gems にインストールしたいので config/environment.rb に次を書き

  config.gem('rspec', :lib => false)
config.gem('rspec-rails', :lib => false)

次を実行する。

rake gems:unpack:dependencies
rake gems:build
script/generate rspec

ちなみに config.gem の :lib は "Use :lib to specify a different name.", "To require a library be installed, but not attempt to load it, pass :lib => false" -- http://api.rubyonrails.org/classes/Rails/Configuration.html ということらしい。テスト用なら :lib => false にする。

ルートのテスト

ルートのテストでは route_to を使う。

{ :get => '/users' }.should route_to(:controller => 'users', :action => 'index')
{ :get => "/users/1" }.should route_to(:controller => 'users', :action => 'show', :id => '1')
{ :get => "/users/1/edit" }.should route_to(:controller => 'users', :action => 'edit', :id => '1')
{ :put => '/users/1' }.should route_to(:controller => 'users', :action => 'update', :id => '1')
{ :delete => '/users/1' }.should route_to(:controller => 'users', :action => 'destroy', :id => '1')

ビューのテスト

ビューのテストでは assigns[:key] でインスタンス変数を設定する。 flash[:key], params[:key], session[:key] もある。

assigns[:post] = @post = stub_model(Post,
:name => "value for name",
:title => "value for title",
:content => "value for content")

タグは have_tag で。 content_for は response[:capture].should have_tag を使う。

response.should have_tag('p', "名前")

response.should have_tag("form[action=?][method=post]", posts_path) do
with_tag("input#post_name[name=?]", "post[name]")
with_tag("input#post_title[name=?]", "post[title]")
with_tag("textarea#post_content[name=?]", "post[content]")
end

response[:footer].should have_tag(‘div’)

ヘルパーメソッドのモック、スタブは template オブジェクトで。

template.should_receive(:logged_in?).with().and_return(true)
template.should_receive(:current_user).with().and_return(mock(User))

コントローラのテスト

mock_model 使えば DB なしでテストできる。ログイン状態にしたいときなどは controller.stub! を使う。

@user = mock_model(User)
@user.stub!(:user_profile).and_return(@user_profile)
controller.stub!(:current_user).and_return(@user)
get :show, :id => 1
response.should be_success
response.should render_template("user_profiles/show.html.erb")

0 件のコメント: