我在我的rails app(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 %>
注意:
这种存根方式对我没有帮助:
允许(控制器)。接收(:logged_in?)。and_return(false)