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?
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.
Utilisez expect{}
Au lieu de expect()
.
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