【问题标题】:How to use controller methods within helper spec?如何在辅助规范中使用控制器方法?
【发布时间】:2021-05-20 16:03:01
【问题描述】:

我正在为 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-rails ruby rspec controller helper


    【解决方案1】:

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

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

    并测试该类实例的行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 2014-03-24
      • 2011-02-05
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多