2012-01-25 10 views
11

szyny rspec-rails (2.7.10) post: Rails 3.1 Error Catching jest dla mnie bez znaczenia.Dlaczego seans_all_requests_local nie powiedzie się z konfiguracją rspec

Kod:

class ApplicationController < ActionController::Base 
    unless Rails.application.config.consider_all_requests_local 
    rescue_from ActiveRecord::RecordNotFound, :with => :render_404 
    rescue_from Exception, :with => :render_500 
    rescue_from FunnyException, :with => :my_errors 

    def my_errors(exception) 
     #some stuff for production 
     puts "=======From top====#{Rails.application.config.consider_all_requests_local}" 
    end 
    else 
    rescue_from FunnyException, :with => :my_errors 
    def my_errors(exception) 
     #some stuff for development 
     puts "=====From bottom======#{Rails.application.config.consider_all_requests_local}" 
    end 
    end 
end 

Kod ten doskonale współpracuje z produkcji/rozwoju ... Problem jest, gdy chcę przetestować go z RSpec. Jak przełączać przypadki testowe między środowiskami?

Próbowałem dodając coś jak:

before do 
    Rails.application.config.consider_all_requests_local = true 
end 

uzyskać:

... ===== Od dołu ====== ===== Od prawdą. dno ====== prawda. ===== Od dole ====== prawda. Od dołu ====== ===== prawda

więc próbował

before do 
    Rails.application.config.consider_all_requests_local = false 
end 

tak mam:

... ===== Od dołu ====== ===== false false Od dołu ====== ===.. == Od dole ====== fałszywe. ===== Od dołu ====== fałszywego

Jak to w ogóle możliwe? ... to samo ze zmianą spec_helpera

config.before(:each) do 
    Rails.application.config.consider_all_requests_local = false 
end 

chyba że nie działa. Top sekcja jest niedostępna z rspec ... zawsze trafia Dno dlaczego? Zakładam, że jest w jakiś sposób związany z Rack ... ale czy istnieje jakieś rozwiązanie, aby dynamicznie zmienić to zachowanie wewnątrz rspec?

pozdrowienia

Odpowiedz

21

Ok znalazłem bardzo proste rozwiązanie

before do 
    Rails.application.config.consider_all_requests_local = false 
    load "application_controller.rb" 
end 

after do 
    Rails.application.config.consider_all_requests_local = true 
    load "application_controller.rb" 
end 

Jest częścią anonimowy aplikacji zestawu testowego regulator.

Musisz dodać po bloku ... ponieważ ta zmiana będzie występować w innych pakietach.

Wszelkie poprawki mile widziane: D

edit: Korzystanie Spork i straży przyczyn dla mnie czasami przypadkowe błędy ... zanim: wszystko wydaje się do rozwiązania tego problemu

+3

Nie jestem pewien, czy moja sytuacja jest taka sama, ale musiałem dodać: 'Rails.application.config.action_dispatch.show_exceptions = true' do poprzedniego bloku. i '... = false' na after. –

+0

Niesamowite rozwiązanie, dokładnie to, czego szukałem. Dziękuję Ci! –

+2

To nie działa dla mnie, gdy uruchamiam pełny pakiet przy użyciu 'rake spec'. Przechodzi tylko wtedy, gdy uruchomię specyfikę 'feature' spec .. –

0

Blok logiczny jest zdefiniowany na poziomie klasy, która pobiera ocenianego w czasie obciążenia klasy. Dlatego nie przejdzie do "else", nawet jeśli ręcznie ustawisz na false w czasie wykonywania.

Jestem również ciekawy, jaki jest najlepszy sposób na sprawdzenie tego. Moja jedyna wskazówka to jakoś przeładować lub ponownie uruchomić ActionController, podobnie jak przeładuj! metoda w konsoli szyn.

0

Okazało się, że z ogórka-szyny właściwą drogę w tym celu należy dodać znacznik @ allow-rescue.

Powiązane problemy