转到 RSpec 中的辅助规范中的路由不起作用

Go to route in helper specs in RSpec does not work

我在用户个人资料页面 (users#show) 中有一个 "Add friend" 按钮,我想测试该按钮是否显示在您自己的个人资料页面 (current_user's)

我在视图文件中有这个 (users/show.html.haml):

- unless current_user == params[:id]
  = button_to 'Add friend', path

我想在UsersHelper中为它创建一个助手:

module UsersHelper
  def correct_user
    current_user == params[:id]
  end
end

所以在视图中它将是:

- unless correct_user
  = button_to 'Add friend', path

如何在 RSpec 中测试它?

在我的 spec/helpers/users_helper_spec.rb 文件中我有:

it 'checks correct user' do
  sign_in( user = create(:user) )
  user2 = create(:user, name: 'foobar')
  get :show, params: { id: user2.to_param }
  expect(helper.correct_user).to be true
end

我为 sign_in (current_user) 设计帮助用户登录的工具:

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :helper
end

基本上测试失败了,因为 get :show, params: { id: user2.to_param } 给我一个错误,给我的印象是在助手规范中路由是不可能的。

我该如何测试 correct_user 助手?我是否应该将它移至控制器(以便我可以在规范中执行 get :show, params: { id: user2.to_param })并在那里进行测试? (并使其成为辅助方法 helper_method :correct_user

您不应该使用 params[:id] 来检查 user 是否匹配 current_user。您必须在控制器操作中使用 params[:id] 获取 User。比如说,你把它存储在一个变量 @user 中。然后,你可以修改你的助手并像这样查看:

助手:

module UsersHelper
  def can_add_friend?(user)
    current_user != user
  end
end

查看:

- if can_add_friend?(@user)
  = button_to 'Add friend', path

现在为这个辅助方法编写 rspec 会更容易。

it 'checks correct user' do
  sign_in( user = create(:user) )
  user2 = create(:user, name: 'foobar')
  expect(helper.can_add_friend?(user2)).to be true
  expect(helper.can_add_friend?(user)).to be false
end