我有一个帮助器,它有一些控制部分显示的逻辑:
module BannerHelper
def show_add_friend_link?
!current_page(friends_path) && !current_user.has_friends?
end
end
require 'rails_helper'
describe BannerHelper do
context 'when user has friends'
it 'does not show the add friends link' do
expect(helper.show_add_friend_link?).to eq false
end
end
end
我正在尝试创建一个测试(使用rspec 3.2)但是没有定义current_user。我已经能够使用来自控制器测试的current_user。 current_user在application_controller中定义。也许不应该从帮助器引用current_user,虽然我不知道在哪里放置这个逻辑。
答案 0 :(得分:2)
您有两种选择。
由于描述Helper的RSpec组将辅助模块混合到自身中,因此您可以将current_user定义为示例中的方法。
describe BannerHelper do
context 'when user has friends'
let(:current_user) { instance_double("User", has_friends: true) }
it 'does not show the add friends link' do
expect(show_add_friend_link?).to eq false
end
end
end
使用依赖注入,并更改辅助方法以接受current_user
作为参数。
答案 1 :(得分:0)
我已经通过放弃RSpec的辅助测试功能来解决这个问题,而是测试控制器测试生态系统中的辅助模块。这样做可以访问request
和session
对象,以及其他帮助方法。
以下是一个例子:
describe BannerHelper, type: :controller do
controller(ApplicationController) do
include BannerHelper
end
describe "#show_add_friend_link?" do
context 'when user has friends'
it 'does not show the add friends link' do
allow(subject).to receive(:current_user).and_return(some_user)
# note that instead of ^ mock you can also simply set needed session key as it is accessible.
expect(subject.send(:show_add_friend_link?)).to eq false
end
end
end
端