2016-09-10 4 views
1

私は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 

答えて

0

あなたのコントローラーテストでは機能しないし、カールで動作する理由は、:indexのフォーマットは:json(これはロジックをrespond_to :jsonに書いたものです)。

変更このRailsの5、私はJSONがあったように、コントローラのアクションを処理するために得ることができる唯一の方法でこの

it 'returns authorization error message' do 
    get :index, format: :json 
    ... 
end 
+0

それは働いた。私はContent-TypeまたはAcceptヘッダーを設定せずにrspecのためにこれがなぜカールのために機能するのか疑問に思っています... – Robs

+0

興味深い。私はあなたがカールでコンテンツタイプjsonを使用したと仮定しました。私は実際にコンテンツタイプが設定されていないjsonをなぜ使用するのか分かりません – MilesStanfield

+0

実際にはヘッダーは設定されていません。オーバーライドされたコントローラで想定されていたように、デフォルトでjsonに応答する必要があります。とにかく - 私に答えるために感謝:) – Robs

0

あなたは、両方が同様の質問への答えで提案されている、FailureAppを定義したり、条件付きフィルタを使用することができます:https://stackoverflow.com/a/10042104/580346

+0

これは、テストのロジックを追加しています。私は既にカールで作業していますが、これはテストでは失敗しています。私はテストのためだけにアプリケーションコードを変更する必要はないと思う。 – Robs

+0

あなたは正しいです、私はそれがカールで動作し、テストで失敗したことを逃しました。 Btwは、この記事が好きかもしれない形式とヘッダーに関する:http://blog.iempire.ru/2016/09/05/rails-obstractions/ – mrzasa

1

it 'returns authorization error message' do 
    get :index 
    ... 
end 

get :action, params: { format: :json, ... } 

・ホープ、この助けられる !

関連する問題