设计和RSpec:访问规范中的当前用户
我试图在我的视图规范中访问Desive helper方法,但没有成功。我以前在这方面看到过很多类似的问题,但似乎没有一个能具体回答我的问题,而那个回答了我的问题的人,有一个解决方案对我不起作用 这是我的rails\u helper.rb文件设计和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
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