2012-01-12 17 views
5

Zastanawiam się, jak sprawdzić poprawność mieszkańców przekazywane do renderowania szablonu w kontrolerzeJak zweryfikować mieszkańców tynku szablon w rspec

Kontroler:

def lelf_panel 
    # ... 
    if some_condition 
    locals_hash = some_very_long_hash_A 
    else 
    locals_hash = some_very_long_hash_B 
    end 
    render :partial => "left_panel", :layout => false, :locals => locals_hash 
end 

Aktualny Spec:

it 'should render correct template for lelf_panel' do 
    # ... 
    get 'left_panel' 
    response.should render_template('system/_left_panel') 
end 

Teraz Konieczne jest dokończenie Rcov dla tego kontrolera, więc muszę dodać/zmodyfikować specyfikację, aby objąć oba wyniki "some_condition". i chcę sprawdzić poprawność lokalnych "lelf_panel" dla renderowania, tak jakbym tylko sprawdzał poprawność render_template, częściowa strona renderowana dla obu wyników jest taka sama.

sprawdzić „” w rspec renderowanie_szablonu docs w http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

to tylko zapewnić i 2nd params do wiadomości, więc jak mogę przetestować mieszkańców przekazywane do renderowania?

Odpowiedz

1

o ile mi wiadomo, nie ma sposobu, aby bezpośrednio zbadać mieszkańców dla szablonu w sposób, który opisujesz.

Możesz zmienić locals_hash na @locals_hash, a następnie zbadać wyniki poprzez przypisania (: locals_hash).

Można również użyć selektorów na wynikowym kodzie HTML i sprawdzić, czy istnieje pewna zawartość indykatywna - na przykład, jeśli locals_hash wpływa na tytuł strony, sprawdź, czy wynikowy tytuł strony HTML jest zgodny z oczekiwaniami.

14

Zamiast korzystać z macierzy render_template, można użyć oczekiwań na obiekcie kontrolera.

it 'should render correct template for lefl_panel' do 
    # ... 
    allow(controller).to receive(:render).with no_args 
    expect(controller).to receive(:render).with({ 
    :partial => 'system/_left_panel', 
    :layout => false, 
    :locals => some_very_long_hash_A 
    }) 
    get 'left_panel' 
end 
+0

ten pracował dla mnie - ale tylko po tym, jak wstawiłem polecenie PO POZA komentarzem should_receive, a także muszę dodać controller.stub (: render), aby uniknąć błędu - ale nie jestem pewien, dlaczego ... – Phantomwhale

+1

To jest najlepsza odpowiedź. Zmiana aplikacji w celu dopasowania do biblioteki testowej jest zapachem kodu. – user94154

+0

@Phantomwhale Właśnie napotkałem ten sam błąd, który napotkałeś. Problem polega na tym, że nasze oczekiwania nie renderują ani nie przekierowują niczego, więc domyślny render jest wywoływany na końcu akcji. To było w porządku z rspec, ale teraz jest to niezaspokojone oczekiwanie. –

1

samo jak @ 's odpowiedź z sugestiami od @ user2490003' Ryan-Ahearn s komentarza - ale wszystko postawić na coś bardziej elastycznego i RSpec 3.

# Safe to set globally, since actions can either render or redirect once or fail anyway 
    before do 
    allow(controller).to receive(:render).and_call_original 
    end 

    describe "get left panel" do 
    before do 
     # other setup 
     get 'left_panel' 
    end 

    it 'should render correct template for lelf_panel' do 
     # Sadly, render_template is primitive (no hash_including, no block with args, etc.) 
     expect(subject).to render_template('system/_left_panel') 
    end 

    it 'should render with correct local value' do 
     expect(controller).to have_received(:render) do |options| 
     expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash') 
     end 
    end 
    end 
+0

Uważam, że ten jest najbardziej użyteczny, jednak musiałem zmienić sygnaturę bloku, przynajmniej w mojej wersji szyn (3.2, nie pytaj;) przekazuje nazwę renderowanej metody. Np. W moim kontrolerze mam indeks "render", locals: {prezenter: prezenter} 'iw mojej specyfikacji mam teraz' oczekiwać (kontroler) .to have_received (: render) do | _method, options | '.. reszta jest taka sama. –

Powiązane problemy