web-dev-qa-db-fra.com

Comment tester la levée des exceptions dans Rails / RSpec?

Il y a le code suivant:

def index
    @car_types = car_brand.car_types
end

def car_brand
    CarBrand.find(params[:car_brand_id])
    rescue ActiveRecord::RecordNotFound
        raise Errors::CarBrandNotFound.new 
end

Je veux le tester via RSpec. Mon code est:

it 'raises CarBrandNotFound exception' do
    get :index, car_brand_id: 0
    expect(response).to raise_error(Errors::CarBrandNotFound)
end

CarBrand avec un identifiant égal à 0 n'existe pas, mon code de contrôleur génère donc Errors :: CarBrandNotFound, mais mon code de test m'indique que rien n'a été généré. Comment puis-je le réparer? Qu'est-ce que je me trompe?

69
malcoauri

Afin de spécifier le traitement des erreurs, vos attentes doivent être définies sur un bloc; l'évaluation d'un objet ne peut pas générer d'erreur.

Donc, vous voulez faire quelque chose comme ça:

expect {
  get :index, car_brand_id: 0
}.to raise_error(Errors::CarBrandNotFound)

Voir Erreur prévue pour plus de détails.

Je suis un peu surpris que vous n'obteniez aucune exception qui remonte jusqu'aux résultats attendus.

94
Jakob S

Utilisez expect{} Au lieu de expect().

76
kaleb4eg

get :index ne lèvera jamais d’exception - il définira plutôt la réponse comme une erreur 500 comme le ferait un vrai serveur.

Au lieu d'essayer:

it 'raises CarBrandNotFound exception' do
  controller.params[:car_brand_id] = 0
  expect{ controller.car_brand }.to raise_error(Errors::CarBrandNotFound)
end
16
BroiSatse