[英]RoR/RSpec - Gem's helper tests cannot access helper methods defined in 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.