Railsアプリ(4.2、ruby 2.2.1)でomniauthを使用しており、このコントローラーをここで定義しました:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
helper_method :current_user, :logged_in?
def logged_in?
!!current_user
end
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id] #memoized
end
end
私の見解ではこれらの方法に問題はありませんが、仕様テストは失敗し続けます。テストではアプリケーション コントローラーのメソッドを使用できないと読んだので、それらをスタブにしようとしました。
失敗したテストの例:
require 'rails_helper'
RSpec.describe "docs/edit", type: :view do
before(:each) do
@doc = assign(:doc, create(:doc))
end
it "renders the edit doc form" do
allow_any_instance_of(ApplicationController).to receive(:logged_in?).and_return(false)
render
assert_select "form[action=?][method=?]", doc_path(@doc), "post" do
end
end
end
そしてエラー:
1) docs/edit renders the edit doc form
Failure/Error: render
ActionView::Template::Error:
undefined method `logged_in?' for #<#<Class:0x007fb1fab057d0>:0x007fb200ac6750>
ビュー内のメソッド:
<% if logged_in? %>
<%= link_to t('your docs'), docs_path(author: current_user) %>
<% end %>
ノート:
- スタブの有無にかかわらず、結果は同じです
- テストは current_user メソッドについて不平を言うようには見えませんが、logged_in を見つけたときに失敗しているためかどうかはわかりません。メソッド
- ここで他の質問をいくつか確認しましたが、どれも役に立ちませんでした。
スタブするこの方法も私を助けませんでした:
allow(controller).to receive(:logged_in?).and_return(false)