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