【问题标题】:Rspec test helperRspec 测试助手
【发布时间】:2017-04-14 15:32:29
【问题描述】:

我很难弄清楚如何测试这个助手,因为current_group 没有在我的测试用例中定义,我不确定如何存根它。

module Admin
  module EmployeesHelper
    def upload_access
      policy(current_group).can_bulk_create_employees?
    end

    def dashboard_params
      download_employee_url = upload_access ?
        download_admin_group_employees_import_csv_index_path(current_group) : nil
      upload_employee_url = upload_access ?
        admin_group_employees_import_csv_index_path(current_group) : nil
      make_hash(upload_employee_url, download_employee_url)
    end

    private

    def make_hash(upload_url, download_url)
      { 
        employees: @employees,
        addEmployeeUrl: new_admin_group_employee_path(current_group),
        terminated_employees: @terminated_employees,
        new_employees: @new_employees,
        test_employees: @test_employees,
        group_id: current_group.id,
        downloadEmployeeUrl: download_url,
        uploadEmployeeUrl: upload_url
      } 
    end
  end
end

这是我的测试的样子,但它失败了,因为 current_group 没有定义。

require 'rails_helper'

describe Admin::EmployeesHelper do
  let!(:group) { create(:group) }

  before do
    # This stub doesn't work because helper doesn't implement current_group 
    allow(helper).to receive(:current_group).and_return(group)
  end

  it 'returns correct dashboard props' do
    allow(helper).to receive(:upload_access).and_return(true)
    props = helper.dashboard_params
    expect(props).values_at(:downloadEmployeeUrl, :uploadEmployeeUrl).should_not include(nil)
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    如果问题仅出在current_group 方法上,您可以将此帮助程序包含在一个虚拟类中。像这样的:

    let(:klass) {
      Class.new do
        include Admin::EmployeesHelper
    
        def current_group
          nil
        end
      end
    }
    
    let(:instance) { klass.new }
    
    before do 
      allow(instance).to receive(:current_group).and_return('whatever') # test-specific group
    end
    
    it 'returns correct dashboard props' do
      allow(instance).to receive(:upload_access).and_return(true)
      props = instance.dashboard_params
      expect(props).values_at(:downloadEmployeeUrl, :uploadEmployeeUrl).should_not include(nil)
    end
    

    虽然我预见到您也必须为 url 助手添加一些内容。并设置这些实例变量。总而言之,这可能不值得麻烦。

    【讨论】:

      【解决方案2】:

      我最终将帮助程序重构为将 current_group 作为参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多