首页 > 解决方案 > 如何在辅助规范中使用控制器方法?

问题描述

我正在为data_session_helper_spec文件编写规范测试,如下所示:

data_session_helper_spec.rb

describe "#methods" do
  let(:data_session1) { create(:data_session) }
  let(:data_session2) { create(:data_session) }
  let(:data_session3) { create(:data_session) }

  describe "#collect_sessions_with_today_if_needed" do
    let!(:team) { create(:program_team, data_sessions: [data_session2, data_session3]) }
    let!(:current_user) { create(:user) }

    it "returns an array with all the data sessions :team" do
      session[:current_program_team_id] = team.id

      expect(collect_sessions_with_today_if_needed)
        .to contain_exactly(["Today", 0],
                          [data_session_label(data_session2).to_s, data_session2.id],
                          [data_session_label(data_session3).to_s, data_session3.id])
    end
  end
...
end

方法collect_sessions_with_today_if_neededDataSessionHelper文件中声明,它看起来像这样:

data_session_helper.rb

module DataSessionHelper
  def collect_sessions_with_today_if_needed
    collection = DataSession.by_team(current_program_team)
                        .where("data_sessions.session_date <= ?", Time.zone.now.to_date)
                        .order(session_date: :desc).selector_data.map { |session| [data_session_label(session), session.id] }
    if DataSession.find_by(session_date: Date.current, program_team: current_program_team, user: current_user).present?
      collection
    else
      collection.unshift(["Today", 0])
    end
  end
...
end

当我尝试为data_session_helper_spec运行 rspec 时,我收到一个错误,即current_program_team未定义并且该方法在 ApplicationController 中定义。

application_controller.rb

class ApplicationController < ActionController::Base
  helper_method :current_program_team
  def current_program_team
    ProgramTeam.friendly.find_by(id: session[:current_program_team_id])
  end

在为帮助程序运行规范时如何访问应用程序控制器方法?

标签: ruby-on-railsrubyrspeccontrollerhelper

解决方案


在控制器之外使用会话和未定义的方法是一种不好的做法。最好将此参数传递给方法(这将很容易测试)。如果你想保留你的解决方案,你可以这样做:

let(:helper_class) do
  Class.new do
    include DataSessionHelper
  
    def current_program_team
      ...
    end
  end
end

并测试此类实例的行为


推荐阅读