如何在Rails中的辅助模块中测试会话功能?

时间:2015-02-17 19:27:58

标签: ruby-on-rails rspec

我有一个帮助器,它有一些控制部分显示的逻辑:

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,虽然我不知道在哪里放置这个逻辑。

2 个答案:

答案 0 :(得分:2)

您有两种选择。

  1. 由于描述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
    
  2. 使用依赖注入,并更改辅助方法以接受current_user作为参数。

答案 1 :(得分:0)

我已经通过放弃RSpec的辅助测试功能来解决这个问题,而是测试控制器测试生态系统中的辅助模块。这样做可以访问requestsession对象,以及其他帮助方法。

以下是一个例子:

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