簡體   English   中英

Rails-如何模擬或訪問助手規范中ApplicationController中定義的方法?

[英]Rails - How to mock or access methods defined in ApplicationController from helper spec?

我正在嘗試為Rails助手編寫規范。 該助手調用在ApplicationController定義並通過helper_method公開的方法:

app / helpers / monkeys_helper.rb

module MonkeysHelper
  def current_monkey_banana_count
    # current_monkey is defined in ApplicationController
    current_monkey.present? ? current_monkey.banana_count : 0 
  end
end

app / controllers / application_controller.rb

class ApplicationController < ActionController::Base   
  helper_method :current_monkey

  protected

  def current_monkey
    @current_monkey ||= Monkey.find(session[:monkey_id])
  end
end

如果我從視圖中調用current_monkey_banana_count並通過瀏覽器訪問它,則可以正常工作。 但是,如果我從這樣的規范中調用它:

spec / helpers / monkeys_helper_spec.rb

RSpec.describe MonkeysHelper, type: :helper do
  describe "#current_monkey_banana_count" do
    it "returns 0 if there is no monkey" do
      expect(helper.current_monkey_banana_count).to eq 0
    end
  end
end

然后在運行規范時收到此錯誤:

NameError:
       undefined local variable or method `current_monkey' for #<#<Class:0x007fe1ed38d700>:0x007fe1e9c72d88>

Rspec文檔說:

要訪問您指定的輔助方法,只需直接在輔助對象上調用它們即可。 注意:不包括控制器中定義的輔助方法。

任何想法如何模擬current_monkey或使其從current_monkey_banana_count內部可見?

謝謝!

也許您可以通過以這種方式模擬current_monkey來實現(您已經嘗試過了嗎?):

RSpec.describe MonkeysHelper, type: :helper do
  let(:monkey) { create(:monkey) }

  before do
    allow(helper).to receive(:current_monkey_user) { monkey }
  end

  # your rest of code
end

干杯!

View可以調用控制器中定義的幫助程序方法,因為控制器會自動評估它們,請在此處檢查代碼。

但是您的幫助程序測試不會調用控制器,因此, MonkeysHelper模塊上無法使用current_monkey 最佳實踐是在助手類中定義的控制器調用助手中定義的助手,反之亦然。 您可以將current_monkey移至MonkeyHelper進行測試。

我發現了一種(討厭的)方法,但是它有效:

spec / helpers / monkeys_helper_spec.rb:

require 'rails_helper'

RSpec.describe CartsHelper, type: :helper do
  before do
    def helper.current_monkey; end
  end

  describe "#current_monkey_banana_count" do
    it "returns 0 if there is no cart" do
      expect(helper).to receive(:current_monkey).and_return(nil)
      expect(helper.current_monkey_banana_count).to eq 0
    end

    it "returns monkey.banana_count if there is a monkey" do
      expect(helper).to receive(:current_monkey).and_return(Monkey.create!(banana_count: 5))
      expect(helper.current_monkey_banana_count).to eq 5
    end
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM