0

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)

4

0 に答える 0