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:
Post a Comment