Rspec Stub应用控制器方法

时间:2015-10-02 18:49:43

标签: ruby-on-rails ruby testing rspec stubs

我在我的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 %>

注意:

  • 有或没有存根,结果是相同的
  • 测试似乎没有抱怨current_user方法,但我不知道是否因为他们在找到logged_in时失败了?方法
  • 我已经在这里查了一些其他问题,但没有一个能帮助我。
  • 这种存根方式对我没有帮助:

    允许(控制器)。接收(:logged_in?)。and_return(false)

0 个答案:

没有答案