2012-09-21 10 views
5

Mam pomocnika, który uzyskuje dostęp do request.fullpath. W ramach izolowanego testu pomocniczego numer request jest niedostępny. Co powinienem zrobić? Czy mogę jakoś wyśmiać lub coś w tym stylu?Szyny: przetestuj pomocnika wymagającego dostępu do środowiska Railsowego (np. Request.fullpath).

Używam najnowszych wersji Rails i RSpec. Oto co moim pomocnikiem wygląda następująco:

def item(*args, &block) 
    # some code 

    if request.fullpath == 'some-path' 
    # do some stuff 
    end 
end 

więc problematyczne linia kodu jest 4, gdzie pomocnik potrzebuje dostępu do obiektu request, który nie jest dostępny w specyfikacji pomocnika.

Bardzo dziękuję za pomoc.

+0

Czy masz „wymagają«rspec/szyny»” w spec_helper.rb? – Rubyman

+0

Tak, robię. Dzięki. –

Odpowiedz

4

Tak, można drwić żądania. Miałem tu długą odpowiedź, opisującą, jak to zrobić, ale w rzeczywistości niekoniecznie jest to, czego chcesz.

Po prostu wywołaj metodę pomocnika na obiekcie pomocnika w swoim przykładzie. Podobnie jak:

describe "#item" do 
    it "does whatever" do 
    helper.item.should ... 
    end 
end 

To da ci dostęp do obiektu żądania testu. Jeśli trzeba podać konkretną wartość dla ścieżki żądanie, można to zrobić tak:

before :each do 
    helper.request.path = 'some-path' 
end 

Faktycznie, pod względem kompletności, pozwól mi to mój oryginalny odpowiedź, ponieważ w zależności od tego, co starasz zrobienie tego może być pomocne.

Oto jak można kpić zgłoszeniu:

request = mock('request') 
controller.stub(:request).and_return request 

Możesz dodać metody pośredniczące do zwracanego życzenie podobnie

request.stub(:method).and_return return_value 

i składni alternatywnej drwić & niedopałek wszystko w jednym wierszu:

request = mock('request', :method => return_value) 

Firma Rspec złoży skargę, jeśli Twoja próbka otrzyma komunikat Ges, których nie zagraliście. Jeśli istnieją inne rzeczy Po prostu wywołaj metodę pomocnika żądania na obiekcie pomocnika, robisz to, czego nie obchodzi twój test, możesz zamknąć rspec w górę, czyniąc z niego przykład "obiektu zerowego", na przykład. jak Podobnie jak

request = mock('request').as_null_object 

Wygląda na to wszystko prawdopodobnie trzeba uzyskać konkretny przejazd testowy to:

describe "#item" do 
    let(:request){ mock('request', :fullpath => 'some-path') } 

    before :each do 
    controller.stub(:request).and_return request 
    end 

    it "does whatever" 
end 
+0

Zignoruj ​​moją poprzednią odpowiedź. Opisano, jak kpić z obiektu żądania, ale niekoniecznie jest to właściwy sposób uzyskania tego, co chcesz w specyfikacji helpera. Patrz wyżej. – gregates

+0

Wielkie dzięki, działa jak urok. Wciąż jednak nie jestem pewien, dlaczego tak się dzieje. Czy bezpośrednie wywołanie 'helper.my_method' nie jest takie samo jak proste wywołanie' my_method'? Czy podczas testowania pomocników powinienem zawsze wywoływać je w obiekcie 'helper'?Czy istnieje podobny obiekt do testów kontrolerów i widoków? –

+1

Jest! jest wiele interesujących rzeczy, które możesz zrobić z anonimowymi kontrolerami; rspec-rails daje ci obiekt 'controller', który dziedziczy z ApplicationController, i możesz zdefiniować na nim akcje skrótowe do testowania before_filters lub cokolwiek innego. Szczerze mówiąc nie jestem pewien, czy jestem dość ekspertem, aby wyjaśnić, dlaczego musisz wywołać swoją metodę na obiekcie 'helper'. Zalecam zapoznanie się z dokumentami rspec na stronie https://www.relishapp.com/rspec/rspec-rails/v/2-11, jeśli chcesz dowiedzieć się więcej. – gregates

0

W spec pomocnika, można uzyskać dostęp do żądania używając controller.request (tak controller.request.stub(:fullpath) { "whatever" } powinno działać)

+0

Dziękuję, ale to nie wydaje się, że obiekt 'request' jest dostępny w helper (co jest problemem). –

Powiązane problemy