QA@IT

RspecでPOST系のアクションをテストするとHTTPコード422を返される

267 PV

仕様

AdminアカウントがUserアカウントを管理するアプリケーションを作っています。
なので、User一覧(index)、User詳細(show)、ユーザー登録(new,create)、ユーザー編集(edit,update)、ユーザー削除(destory)。Adminでログインしている状態でしか、これらのアクションをできない様にする。

したい事

・deviseでAdminにログインした状態でしか、アクションを出来ない事を確かめるテストコードを書きたい。

現状

・GET系のアクションはテストコードが成功しているが、POST系のアクション(create, update, delete)はhttp422を返されエラー。
422について調べてみても全くわかりませんでした。

コード

まず、テストコードで「login」という自作メソッドを使っています。
ファイルパスは「spec/support/authentication_macros.rb」です。

module AuthenticationMacros
  def login
    let(:admin) {create(:admin)} 
    before do
      sign_in admin
    end 
  end
end

以下の2行を「spec/rails_helper.rb」に書き足して、「login」という自作メソッドを読み込んでいます。

config.include Devise::Test::IntegrationHelpers, type: :request
config.extend AuthenticationMacros

次に、テストコードです。

require 'rails_helper'
RSpec.describe 'Pages', type: :request do
  describe 'ログインした状態でアクションが成功するか' do
    login
    describe 'GET系は成功する' do
      let(:user) { create(:user) }
      example 'index, show, new, edit' do
        get '/'
        get '/users/3'   # /users/:idだとエラーが起きるので、idを直接指定指定ます。
        get '/users/3/edit' 
        get '/users/new' 
        expect(response).to have_http_status(:success)
      end
    end
    describe 'なぜかPOST系は失敗する。422を返される' do
      example 'create' do
        post '/users/3/create'
        expect(response).to have_http_status(:success)
      end
      example 'update' do
        patch '/users/3'
        expect(response).to have_http_status(:success)
      end
      example 'delete' do
        delete '/users/3'
        expect(response).to have_http_status(:success)
      end
    end
  end
end

なぜこの様な結果になるのか皆目見当もつきません。
422番が何を指すかもさっぱり分かりません(勿論、色々調べてはいます)
2日間もこれに悩まされています。
どなたか知恵をお貸しください。。。

ウォッチ

この質問への回答やコメントをメールでお知らせします。