J’aimerais faire quelque chose comme ça:
some_method.should_raise
Comment devrais-je faire ça?
some_method.should_raise exception
… ne fonctionne pas
expect { some_method }.to raise_error
RSpec 1 Syntaxe:
lambda { some_method }.should raise_error
Consultez la documentation (pour la syntaxe RSpec 1) et la documentation RSpec 2 pour plus d’informations.
Au lieu de lambda, utilisez:
expect { some_method }.to raise_error
Ceci est valable pour les versions plus récentes de rspec, à savoir rspec 2.0 et les versions ultérieures.
Voir le doco pour plus.
expect { some_method }.to raise_error expect { some_method }.to raise_error(SomeError) expect { some_method }.to raise_error("oops") expect { some_method }.to raise_error(/oops/) expect { some_method }.to raise_error(SomeError, "oops") expect { some_method }.to raise_error(SomeError, /oops/) expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" } # Rspec also offers to_not: expect { some_method }.to_not raise_error ...
Remarque: raise_error
et raise_exception
sont interchangeables.
lambda { some_method }.should raise_error lambda { some_method }.should raise_error(SomeError) lambda { some_method }.should raise_error(SomeError, "oops") lambda { some_method }.should raise_error(SomeError, /oops/) lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" } # Rspec also offers should_not: lambda { some_method }.should_not raise_error ...
Remarque: raise_error
est un alias pour raise_exception
.
RSpec 2:
RSpec 1:
La syntaxe a changé récemment et maintenant c’est:
expect { ... }.to raise_error(ErrorClass)
À partir de la version 3.3 sur rspec-expections
gem déclenche un avertissement pour un raise_error vide sans paramètre
expect { raise StandardError }.to raise_error # results in warning expect { raise StandardError }.to raise_error(StandardError) # fine
Cela vous donne une indication que votre code peut échouer avec une erreur différente de celle du test destiné à vérifier.
AVERTISSEMENT: L’utilisation du
raise_error
sans fournir d’erreur ou de message spécifique risque deraise_error
des faux positifs, carraise_error
correspondra lorsque Ruby déclenche uneNoMethodError
,NameError
ouArgumentError
, permettant potentiellement à l’attente de passer sans même exécuter la méthode à appeler. Au lieu de cela, envisagez de fournir une classe ou un message d’erreur spécifique. Ce message peut être supprimé en définissant:RSpec::Expectations.configuration.warn_about_potential_false_positives = false
.