【问题标题】:Devise and RSpec: Accessing current_user in specs设计和 RSpec:在规范中访问 c​​urrent_user
【发布时间】:2015-05-18 14:28:07
【问题描述】:

我试图在我的视图规范中访问设计辅助方法但没有成功。我以前见过很多类似的问题,但似乎没有一个专门回答我的问题,而回答的问题的解决方案对我不起作用。

Testing Views that use Devise with RSpec

这是我的 rails_helper.rb 文件

 RSpec.configure do |config|

  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include FactoryGirl::Syntax::Methods
  config.include Devise::TestHelpers, type: :controller
  config.include Devise::TestHelpers, :type => :view
  config.include ControllerMacros, :type => :controller
  include Warden::Test::Helpers
  Warden.test_mode!
end

这里是简单的 show.html.erb_spec.rb

describe "users/show.html.erb" do
   it "displays the users own profile" do
   member = create(:member)
   login_as(member, :scope => :member)
   user = member.user
   assign(:user, user)
   render(:template => 'users/show.html.erb')
 end
end

现在请记住,我有一个用于设计的“成员模型”和一个用于保存个人资料信息的“用户模型”。他们有一个拥有一个/属于一个的关系。

我使用 current_member 助手(由 devise 提供),在我的应用程序控制器中我有:

class ApplicationController < ActionController::Base
   include UsersHelper
   helper_method :current_user
   before_action :authenticate_member!
   before_action :current_user
   before_filter :instantiate_search

  def current_user
      if member_signed_in?
       @current_user = User.find_by_member_id(current_member.id)
      end
  end

所以基本上我还定义了一个 current_user,它是 current_member 的用户。

我的问题是在我的 show.html.erb 文件中我使用 current_user

我的错误是

   undefined local variable or method `current_user' for #<#   <Class:0x007fb6139e7f48>:0x007fb6139d6fe0>

我需要能够在我的测试中访问设计 current_member 但我不能。

我们将不胜感激地接受任何帮助。

edit:这行得通,但是是可怕的代码。

有没有更好的办法?

 require 'rails_helper'

   describe "users/show.html.erb" do


       it "displays the users own profile" do
          @request.env["devise.mapping"] = Devise.mappings[:member]
          @member = create (:member)
          sign_in @member
          @user = @member.user
          def view.current_user
           @user
          end
           assign(:user, @user)
           render(:template => 'users/show.html.erb')
         end
       end

【问题讨论】:

  • 嗨,@GhostRider,我也遇到了同样的问题。你找到更优雅的解决方案了吗?

标签: rspec devise helper


【解决方案1】:

尝试做类似的事情

current_user = stub_model(:User)    
allow(view).to receive(:current_user).and_return(current_user)

在前块中

【讨论】:

    【解决方案2】:

    这可能是一个关于答案的问题,但我做了以下事情并且成功了。

    在您尝试测试的视图的控制器中: (我总是为 Devise 用户构建自己的控制器,这样我就可以轻松添加页面,但您可以在 controllers/users/sessions 中执行此操作。)

    def show
      @name = current_user.name
    end
    
    

    然后,您可以在before(:each) 块中执行以下操作:

    assign(:name, @user.name)
    

    我从 Django 带来的一个推论是你不能在视图中调用对象的方法,这会强制你的所有逻辑进入控制器。这可能是语义上的,但是当我从视图中删除逻辑时,我发现我的代码更容易阅读。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      在帮助规范中访问 c​​urrent_user。

      let(:user) { FactoryBot.create(:user) }
      
      it 'works with CSV template in physical bulk send' do
            allow(helper).to receive(:current_user).and_return(user)
            expect(helper.say_hello_world).to eq('Hello World')
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-31
        • 1970-01-01
        相关资源
        最近更新 更多