Friday, November 27, 2009

Rails Integration Test (2) - restful_authentiaction plugin を導入した際の integration test の書き方

Railsでrestful_authentication plugin を導入したら,今までのintegration testが 通らなくなった。理由は,login sessionが確立されていないかだが,どのように login sessionを integration test内で確立させるか?

% script/generate authenticated user sessions
で,sessions_controllerを作成したとき,test/functional/sessions_controller_test.rbが作成され,
  def test_should_logout
    login_as :quentin
    get :destroy
    assert_nil session[:user_id]
    assert_response :redirect
  end
というのがあるので,login_as methodが利用できると考えられる。しかし,単純にlogin_asを呼びだしても,
  1) Error:
test_comming_and_going_editing_acount_view_and_creating_new_category(AccountCategoryFlowsTest):
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.session
    /lib/authenticated_test_helper.rb:4:in `login_as'
    test/integration/account_category_flows_test.rb:17:in `test_comming_and_going_editing_acount_view_and_creating_new_category'
と怒られる。そこでlogin_as methodがどのように定義されているかを確認すると,
lib/authenticated_test_helper.rb
  def login_as(user)
    @request.session[:user_id] = user ? (user.is_a?(User) ? user.id : users(user).id) : nil
  end
とあるように,@requestを事前に準備していなければならない。その答えは,Rails forumの次のdiscussionにあった。 how to get a user in a functional test, with AuthenticatedSystem? より,
  def setup
    @request    = ActionController::TestRequest.new
  end
setupで,ActionController::TestRequestのインスタンスを@requestに作成しておけば login_as を実行しても怒られなくなった。

No comments: