2017-03-17 1 views
1

J'essaye de créer un test de RSpec qui détecte si une demande peut planter le contrôleur, habituellement une erreur 500. Donc, je veux être en mesure de faire la distinction entre:Comment faire pour tester qu'une requête ne renvoie pas 500 erreur?

nil.invalid_method # raises NoMethodError 

de

params.require(:required_parameter) # raises ActionController::ParameterMissing 

dans un contrôleur d'une manière générique. Quand je fais une request, feature ou controller test, il déclenche une exception:

describe "Post", type: :request do 
    it 'does not crash when no params given' do 
    post '/posts' # this line launches an exception 
    expect(page).to_not have_http_status(500) 
    end 
end 

Il semble que, avant RSpec (ou Rails je ne sais pas) avaient un comportement différent, semblable à je recherche:

Comment est-ce que je peux faire ceci? Ou comment ferais-tu?

Merci pour votre temps.

+0

@max @spickermann Je ne me suis pas expliqué correctement. Mon but n'est pas de vérifier quelle exception est soulevée. Peut-être que mon contrôleur traite le problème d'une autre manière, c'est-à-dire: il renvoie un message d'erreur à l'intérieur du code HTML. Pour cette raison, je veux un * moyen générique * pour détecter qu'il n'y a pas une 'erreur de codage'. Rails utilise des exceptions pour gérer plusieurs situations qui ont le bon code comme 'ActionController :: ParameterMissing', à cause de cela je ne peux pas utiliser' except {...} .to_not raise_exception'. –

Répondre

1

Vous pouvez utiliser une spécification de contrôleur qui ne rend pas 500, mais soulève l'exception au lieu:

describe "PostController", type: :controller do 
    describe "POST index" do 
    it 'does not crash with valid params' do 
     expect { 
     post :index, { post: { title: 'foo' } } 
     }.to_not raise_exception 
    end 
    end 

    describe "POST index" do 
    it 'crashes without params' do 
     expect { 
     post :index 
     }.to raise_exception(ActionController::ParameterMissing) 
    end 
    end 
end 

Notez également les accolades { ... } après expect.

0

Vous pouvez vérifier que le contrôleur ne soulève pas une exception non capturée en utilisant le raise_error matcher:

RSpec.describe "Things", type: :request do 
    describe "POST /things" do 
    it "does not raise an error" do 
     # we pass a block to expect 
     expect { post things_path }.to_not raise_error 
    end 
    end 
end 

Si l'exception est sauvé dans le contrôleur en utilisant le mot-clé rescue ou Rails rescue_from vous tester la réponse Code comme d'habitude:

class ThingsController < ApplicationController 
    rescue_from ActionController::ParameterMissing do 
    head 500 
    end 

    def create 
    raise ActionController::ParameterMissing.new('foo') 
    end 
end 

RSpec.describe "Things", type: :request do 
    describe "POST /things" do 
    it "work even if the param is not provided" do 
     post things_path 
     expect(response).to successful 
    end 
    end 
end 

Dans ce cas, il est beaucoup plus utile pour vérifier que la réponse est ce que vous attendiez que ce soit - pas que ce n'est pas un 500.