私はhtmlテンプレートの代わりにjsonをレンダリングするdeviseでデフォルト応答をオーバーライドしました。私がカールや郵便配達でテストするときはうまく動作しますが、rspecでテストするときはうまく動作します。 readme.mdを使用してコントローラをテストする方法についての情報を読んだので、ログインすると正常に動作しますが、認証されていないリクエストをテストするときには動作しません。受信rspecでjson応答の代わりにリダイレクトを作成する
応答:
<html><body>You are being <a href=\"http://test.host/users/sign_in\">redirected</a>.</body></html>
の代わり:
{"error":"You need to sign in or sign up before continuing."}
アプリ/コントローラ/ playlists_controller.rb:
class PlaylistsController < ApplicationController
before_action :authenticate_user!
def index
render json: Playlist.all
end
end
アプリ/コントローラ/ sessions_controller.rb:
class SessionsController < Devise::SessionsController
clear_respond_to
respond_to :json
end
スペック/コントローラ/ playlists_controller_spec.rb:
require 'rails_helper'
describe PlaylistsController do
context 'when user is not signed in' do
it 'returns authorization error message' do
get :index
expect(response.body).to eq 'some message here'
end
end
end
仕様/サポート/ devise.rb
RSpec.configure do |config|
config.include Devise::TestHelpers, type: :controller
end
それは働いた。私はContent-TypeまたはAcceptヘッダーを設定せずにrspecのためにこれがなぜカールのために機能するのか疑問に思っています... – Robs
興味深い。私はあなたがカールでコンテンツタイプjsonを使用したと仮定しました。私は実際にコンテンツタイプが設定されていないjsonをなぜ使用するのか分かりません – MilesStanfield
実際にはヘッダーは設定されていません。オーバーライドされたコントローラで想定されていたように、デフォルトでjsonに応答する必要があります。とにかく - 私に答えるために感謝:) – Robs