2010-10-02 10 views
22

Ho un test funzionale che utilizza i dispositivi. Sto anche utilizzando i dispositivi nei miei test di unità, ma funzionano senza difetti. Durante l'esecuzione delle prove funzionali, ottengo un:In Rails 3, ricevo un NoMethodError per il riciclo! metodo durante il test

NoMethodError: undefined method 'recycle!' for #<Response:0x10346be10> /test/functional/responses_controller_test.rb:10:in 'test_testing'

miei test funzionali, a questo punto, stanno facendo niente di più che un get all'azione index. Esempio:

setup do 
    @response = responses(:one) 
end 

test "testing" do 
    get :index 
    assert true 
end 

La mia classe TestHelper include tutti i proiettori, quindi i dispositivi di risposta sono definitivamente caricati. E come ho detto, i proiettori funzionano perfettamente bene nei test unitari.

Qualche idea di cosa potrebbe causare questo?

risposta

44

Change

setup do 
    @response = responses(:one) 
end 

a

setup do 
    @myresponse = responses(:one) 
end 

e il gioco è fatto!

Il problema sta nel "actionpack-3.0.1/lib/action_controller/test_case.rb" intorno alla linea 386.

Il testcase presuppone che @response detiene una "ActionDispatch :: Response". Lo sovrascrivi, non c'è più "ActionDispatch :: Response" e il testcase fallisce.

Non sono sicuro se questo è il comportamento previsto.

In ogni caso, assicurati di non sovrascrivere @ response/@ request/@ controller/@ routes e dovrebbe funzionare.

+1

Grazie, ho appena salvato il mio bacon. Ho avuto un problema simile con una variabile chiamata @request. –

+0

Wow! Aveva esattamente lo stesso codice dell'OP e ora ho esattamente lo stesso codice della tua soluzione! @flo – Ben

2

risposta di Flo è in gran parte corretto, ma volevo solo chiarire:

In Rails 3.0.x che @request dovrebbe essere un tipo ActionController::TestRequest, che ha il metodo recycle! definita su di esso. C'è TestResponse, TestRequest e TestSession.

Si potrebbe voler inizializzare o manipolare effettivamente oggetti di questo tipo per determinate situazioni. Nel mio caso, avevo bisogno di prendere in giro il sito che ha un nome di dominio specifico con

@request = ActionController::TestRequest.new unless @request 
@request.host = "www.hostname.com" 
2

Ho appena avuto un problema simile denominazione una variabile @request. Sono passato a @_request e ho risolto il problema.

+0

Grazie. Lo stesso vale per '@ response'. – scarver2