Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设计和RSpec:访问规范中的当前用户_Rspec_Devise_Helper - Fatal编程技术网

设计和RSpec:访问规范中的当前用户

设计和RSpec:访问规范中的当前用户,rspec,devise,helper,Rspec,Devise,Helper,我试图在我的视图规范中访问Desive helper方法,但没有成功。我以前在这方面看到过很多类似的问题,但似乎没有一个能具体回答我的问题,而那个回答了我的问题的人,有一个解决方案对我不起作用 这是我的rails\u helper.rb文件 RSpec.configure do |config| config.fixture_path = "#{::Rails.root}/spec/fixtures" config.include FactoryGirl::Syntax::Meth

我试图在我的视图规范中访问Desive helper方法,但没有成功。我以前在这方面看到过很多类似的问题,但似乎没有一个能具体回答我的问题,而那个回答了我的问题的人,有一个解决方案对我不起作用

这是我的rails\u 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
现在请记住,我有一个Desive的“成员模型”和一个保存个人资料信息的“用户模型”。他们有一个“有一个/属于一个”关系

我使用当前的_成员助手(由Desive提供),在我的应用程序控制器中,我有:

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 = stub_model(:User)    
allow(view).to receive(:current_user).and_return(current_user)

在before块中,这可能是一个关于周围的答案,但我做了以下操作,它成功了

在您尝试测试的视图的控制器中: (我总是为Desive用户构建自己的控制器,这样我就可以轻松地添加页面,但您可以在
控制器/用户/会话中这样做

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

assign(:name, @user.name)
我从Django带来的一个推论是,您不能在视图中的对象上调用方法,这会将您的所有逻辑强制到控制器中。这可能是语义问题,但我发现当我从视图中删除逻辑时,我的代码更易于阅读


希望这有帮助

访问助手规范中的当前用户

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

嗨,@GhostRider,我也有同样的问题。你找到一个更优雅的解决方案了吗?
def show
  @name = current_user.name
end

assign(:name, @user.name)
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