2017-08-27 1 views
0

Ich versuche, Spezifikationen für einen Rails-Helfer zu schreiben. Dieser Helfer ruft eine Methode definiert in ApplicationController und ausgesetzt durch helper_method:Rails - Wie mock oder Zugriff auf Methoden in ApplicationController von Helper spec definiert?

app/Helfer/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 

Wenn ich current_monkey_banana_count aus einer Ansicht aufrufen und über den Browser darauf zugreifen, funktioniert es gut. Aber wenn ich nenne es von einem spec wie folgt aus:

spec/Helfer/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 

Dann bekomme ich diesen Fehler, wenn ich die spec laufen:

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

Rspec documentation sagt:

Um auf die Hilfsmethoden zuzugreifen, die Sie angeben, simpl y rufe sie direkt auf das Hilfsobjekt. HINWEIS: Hilfsmethoden, die in Controllern definiert sind, sind nicht enthalten.

Jede Idee, wie man entweder mock current_monkey oder es von innen current_monkey_banana_count sichtbar machen?

Danke!

Antwort

0

fand ich eine (böse) Art und Weise, es zu tun, aber es funktioniert:

spec/Helfer/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 
0

Vielleicht kann man das erreichen von current_monkey auf diese Weise verspotten (haben Sie es schon versucht?):

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 

Prost!

+0

Leider versagt diese mit ' nicht implementiert: current_monkey '. Anscheinend können Sie eine Methode nicht vortäuschen, die nicht definiert wird :( –

0

View kann Hilfsmethoden aufrufen, die im Controller definiert sind, da der Controller sie automatisch auswertet. Bitte überprüfen Sie den Code here.

Aber Ihr Helfer Test ruft Controller nicht, so dass current_monkey nicht auf MonkeysHelper Modul verfügbar ist. Die beste Vorgehensweise sind Helfer, die in Helferhilfsmitteln für Controller definiert sind, aber nicht umgekehrt. In deinem Fall kannst du current_monkey zu MonkeyHelper bewegen, um es testen zu können.

+0

'current_monkey' verwendet das' session' Objekt, das in den Helfern nicht verfügbar ist, also kann ich es zu 'MonkeyHelper' nicht verschieben. –

Verwandte Themen