web-dev-qa-db-fra.com

Comment utiliser RSpec devrait_raise avec n'importe quel type d'exception?

J'aimerais faire quelque chose comme ça:

some_method.should_raise <any kind of exception, I don't care>

Comment dois-je faire cela?

some_method.should_raise exception

... ne fonctionne pas.

211
marcgg
expect { some_method }.to raise_error

Syntaxe RSpec 1:

lambda { some_method }.should raise_error

Voir la documentation (pour la syntaxe RSpec 1) et documentation RSpec 2 pour plus d'informations.

380
Avdi

RSpec 2

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.

RSpec 1

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.

Documentation: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:

86

Au lieu de lambda, utilisez s'attendre à:

   expect { some_method }.to raise_error

Ceci s’applique aux versions plus récentes de rspec, c’est-à-dire rspec 2.0 et versions ultérieures.

Voir le doco pour plus.

84
racc

La syntaxe a changé récemment et maintenant c'est:

expect { ... }.to raise_error(ErrorClass)
65
ayckoster

À partir de la version 3.3, rspec-expections Gem génère un avertissement pour un événement 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é à être vérifié.

AVERTISSEMENT: utiliser l’affichage raise_error Sans fournir d’erreur ou de message spécifique risque de générer de faux positifs, car raise_error Sera identique lorsque Ruby déclenche un NoMethodError , NameError ou ArgumentError, permettant potentiellement à l'attente de passer sans même exécuter la méthode que vous souhaitez 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.

4
Bruno E.