【问题标题】:Testing current user in helper spec在帮助规范中测试当前用户
【发布时间】:2016-04-26 13:18:56
【问题描述】:

我有这个非常基本的助手,它依赖于 Sorcery 在控制器和助手中提供的 current_user 变量

def current_user_link
    user_link current_user
end

 def user_link(user, html_options = {}, &block)
   link_to user.to_s, user, html_options, &block
 end

如何测试这个助手?

describe UsersHelper do
  describe '#current_user_link' do
    it 'should return a link to the current user' do
      expected_link = link_to current_user.name, current_user
      ???

      expect(current_user_link).to eq expected_link
    end
  end

我是否需要以某种方式存根current_user? 它甚至值得测试吗?

【问题讨论】:

    标签: ruby-on-rails testing rspec helpers


    【解决方案1】:

    我就是这样解决的。

    describe '#current_user_link' do
      it 'returns a link to the current user ' do
        user = build(:user)
        expected_link = link_to user.name, user
        allow(controller).to receive(:current_user).and_return(user)
    
        expect(helper.current_user_link).to eq(expected_link)
      end
    end
    

    PSA:不要忘记在helper 上调用您的方法。

    【讨论】:

      【解决方案2】:

      我试图在 Rspec ApplicationHelper 规范中将 current_user 与 Sorcery 一起使用,但上述答案均不适合我。

      对我有用的是首先使用 FactoryGirl 定义 user

      let(:user) { create(:user) }

      然后,写一个这样的例子:

      it "does stuff" do
        allow(helper).to receive(:current_user).and_return(user)
        expect(helper.some_method_using_current_user).to do_something
      end
      

      主要区别在于示例中使用了helper 对象。

      【讨论】:

      • 谢谢!使用allow(helper) 是为我做的。我尝试使用allow(controller) 并没有成功。我在 Helper 规范中,所以这是有道理的,但大多数其他答案都说要使用 controller。干杯!
      【解决方案3】:

      你可以stub你的current_user

      describe UsersHelper do
        describe '#current_user_link' do
          let(:user) { FactoryGirl.build(:user) }
          let(:expected_link) { link_to user.name, user }
      
          before { allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) }
      
          it { expect(current_user_link).to eq(expected_link) }
        end
      end
      

      或将您的用户设置为会话 比你应该的

      let(:user) { FactoryGirl.create(:user) }
      

      before { allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(user_id: user.id) }
      

      【讨论】:

      • 嗨。我仍然收到NameError: undefined local variable or method `current_user' for RSpec::ExampleGroups::UsersHelper::CurrentUserLink ...
      • 也适用于session
      • 是的,同样的错误。我重新启动了服务器,如果这很重要。它没有帮助
      • 能否提供 RSpec 版本?
      • 我复制粘贴了您的代码...如果您的意思是错误,here it is
      【解决方案4】:

      最简单的解决方法是在规范中声明:

      let(:current_user) { create(:user) }

      【讨论】:

        【解决方案5】:

        这对我有用:

        describe UsersHelper do
          describe '#current_user_link' do
            it 'should return a link to the current user' do
              user = FactoryGirl.create(:user)
              allow_any_instance_of(UsersHelper).to receive(:current_user).and_return(user)
        
              expected_link = link_to user.name, user
              expect(current_user_link).to eq(expected_link)
            end
          end
        end
        

        rails_helper.rb你需要有:

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

        【讨论】:

          【解决方案6】:

          使用 RSpec 测试帮助模块时,您需要在 Rspec::ExampleGroups 目标中存根方法...

              allow_any_instance_of(RSpec::ExampleGroups::UsersHelper).to receive(:current_user).and_return user
          

          【讨论】:

            【解决方案7】:

            来自 Devise 的人:

            您可以简单地在规范中定义方法。

              describe 'option_for_product_weight' do
                before {
                  def helper.current_user
                    User.first
                  end
                }
            
                subject { helper.option_for_product_weight }
            
                it 'returns the list' do
                  expect(subject).not_to be_empty
                end
              end
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-15
              • 2011-11-07
              • 2011-08-22
              • 1970-01-01
              • 1970-01-01
              • 2011-01-10
              相关资源
              最近更新 更多