JSON として投稿する Rspec テスト

概要

Rspec テスト内のコントローラー アクションに JSON として投稿しようとすると問題が発生します。

RSpec.describe RegistrationsController, type: :controller do
  context 'Adding a Valid User' do
    it 'Returns Success Code and User object' do
     @params = { :user => {username: 'name', school: 'school'} }.to_json
     post :create, @params
    end
  end
end

現時点では、ポストリクエストの起動を成功させたいのですが、常にこのエラーが返されます。

Failure/Error: post :create, @params
 AbstractController::ActionNotFound:
   Could not find devise mapping for path "/lnf".

私のルートは次のように設定されています。

Rails.application.routes.draw do
 constraints(subdomain: 'api') do
   devise_for :users, path: 'lnf', controllers: { registrations: "registrations" }

   devise_scope :user do
     post "/lnf" => 'registrations#create'
   end
 end
end

Rake ルートは次を出力します。

Prefix Verb              URI Pattern     Controller#Action
user_registration POST   /lnf(.:format)  registrations#create {:subdomain=>"api"}
lnf POST                 /lnf(.:format)  registrations#create {:subdomain=>"api"}

同じアクションに対して 2 つの宣言があるということでしょうか?

解決策

数時間の骨の折れる作業の後、次の手順を実行することでテストが正しく通過し、JSON として投稿できるようになりました。

require 'rails_helper'

RSpec.describe RegistrationsController, type: :controller do
  before :each do
    request.env['devise.mapping'] = Devise.mappings[:user]
  end
 context 'Adding a Valid User' do
  it 'Returns Success Code and User object' do
   json = { user: { username: "richlewis14", school: "Baden Powell", email: "[email protected]", password: "Password1", password_confirmation: "Password1"}}.to_json
  post :create, json
  expect(response.code).to eq('201')
 end
end
end

私のルートは通常に戻りました:

Rails.application.routes.draw do
 constraints(subdomain: 'api') do
  devise_for :users, path: 'lnf', controllers: { registrations: "registrations" }
 end
end

私のテスト環境では、以下を追加する必要がありました。

config.action_mailer.default_url_options = { host: 'localhost' }

ここでの鍵は次のとおりです。

request.env['devise.mapping'] = Devise.mappings[:user]

それが何をするのかはまだ完全にわかっていないので、次に調べるリストにありますが、テストは実行され始めており、合格し始めています。