设计和RSpec:在规范中访问current_user

时间:2015-05-18 14:28:07

标签: rspec devise helper

我试图在我的视图规范中访问设计帮助器方法但没有成功。我之前已经看到了很多类似的问题,但似乎没有人专门回答我的问题而且那个问题的答案对我来说有一个解决方案。

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>

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

感谢任何帮助。

编辑:这可行,但是可怕的代码。

有更好的方法吗?

 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

3 个答案:

答案 0 :(得分:3)

尝试做类似

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

在前一栏中

答案 1 :(得分:0)

这可能是一个大概的答案,但是我做了以下工作,并且奏效了。

在您要测试的视图的控制器中: (我总是为Devise用户构建自己的控制器,以便可以轻松添加页面,但您可以在controllers/users/sessions中进行添加。)

def show
  @name = current_user.name
end

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

assign(:name, @user.name)

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

希望这会有所帮助!

答案 2 :(得分:0)

在帮助程序规范中访问current_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