Rails: Durante il test regolatori con RSpec, come faccio li impedisce di reindirizzamento?
-
22-09-2019 - |
Domanda
Ho metodi di controller che assomigliano a questo:
class TestController < ApplicationController
def testAction
render :json => { 'success'=>1 }.to_json
end
end
Quando carico questa azione nel browser, ottengo quello che mi aspetto: {"success":1}
Durante il test con RSpec, tuttavia, response.body
mi dà '<html><body>You are being <a href="https://test.host/test/testAction">redirected</a>.</body></html>'
Ho notato che questo reindirizzamento strano sta accadendo con tutti i miei controllori. Come posso fermare questo reindirizzamento accada, in modo da poter eseguire controlli sul corpo di risposta?
Grazie!
----------------------- EDIT:
Qualsiasi idea del perché il seguente fallimento del test sta succedendo?
# app/controllers/test_controller.rb
def test
flash[:notice] = 'test'
end
# spec/controllers/test_controller_spec.rb
describe TestController, "calling the test() method" do
it "should set the flash notice" do
put :test
flash[:notice].should_not be_blank
end
end
# result
'TestController calling the test() method should set the flash notice' FAILED
expected blank? to return false, got true
Soluzione
Cambia la tua asserzione di essere
response.should be_redirect
Almeno, se si sta facendo la cosa giusta:)
Altri suggerimenti
Sono confuso perché la vostra uscita di test dice 'ApiController chiamando il metodo di prova () ...', quando il tuo esempio sembra essere per TestController. Ho eseguito un paio di esempi di mio e mi sembra di ottenere i risultati corretti. Io suggerisco di provare il debugger Rubino (gemma ruby-debug) per diagnosticare questo. In questo modo si può confermare che il codice corretto viene chiamato così come in modo interattivo controllare i valori.
Per definizione, si esegue un test di unità sul controller e quindi non dovrebbe cercare di vedere cosa c'è nella risposta, ma solo che l'azione corretta è successo e ha fatto tutto che doveva fare. Testare il contenuto della risposta è un lavoro per un test di integrazione, come cetriolo.
In sostanza, provare affermando che il controllore ha tentato un reindirizzamento.
@response.should be_redirect