2009年8月12日水曜日

ActiveResourceを使っている Controllerを RSpecでテストする例

参照系しか試してない。


下記の例では、MemberというActiveResourceをリスト表示したり詳細表示したりするControllerについて、RSpecでテストする。
(参考:ActiveResource の使い方(前編) : Rails 同士で通信する - WebOS Goodies ※「ユニットテスト」の項。RSpecではないけど。)

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
require 'active_resource/http_mock'

describe MembersController do

 before do
  @member = {:id => 1, :name => 'foo'}

  @members = [@member]

  @header = Member.connection.__send__(:build_request_headers, {}, :get)

  ActiveResource::HttpMock.respond_to do |mock|
   mock.get '/members.xml', @header, @members.to_xml(:root => 'members')
   mock.get '/members/1.xml', @header, @member.to_xml(:root => 'member')
  end
 end

#後は普通にケースを書く
 #(略)

end

要するに、http_mockをrequireしておき、before()でモックが返すXMLを定義している。


ActiveResourceで取得する際にパラメータ付きのURLを使う場合、「mock.get」のところにもパラメータを付けなければいけないので注意。
例:
mock.get '/members.xml?q=keyword', @header, @members.to_xml(:root => 'members')



...と、ここまで書いてから、mockを使ってテストできることを知った。
 before do
  @member = mock_model(Member)
  Member.should_receive(:find).with(:all).and_return(@member)
  get 'index'
 end
ActiveResourceでもActiveRecordでもModelであることには違いがないから、ただMockを使えば良いだけだった。

HttpMockはむしろ、ActiveResource::Baseを継承したModelのテストのために使うのか。

0 件のコメント:

ブログ アーカイブ

tags