ruby - verdaderas - ¿Cómo probar que los argumentos inválidos generan una excepción ArgumentError usando RSpec?
metodos para probar la validez de un argumento (3)
A menos que sea muy importante que arroje una excepción para valores no booleanos, creo que sería más elegante forzar el valor a un booleano, por ejemplo con !!
:
baz = !! options.fetch(:baz, true)
De esta forma, el código del cliente puede pasar cualquier valor falso o falso, pero aún así puede estar seguro de que el valor con el que trabaja es un valor booleano adecuado. También podría usar el operador ternario (por ejemplo, baz = options.fetch(:baz, true) ? true : false
si cree que no está claro.
Estoy escribiendo un RubyGem que puede generar un ArgumentError
si los argumentos proporcionados a su único método no son válidos. ¿Cómo puedo escribir una prueba para esto usando RSpec?
El siguiente ejemplo muestra el tipo de implementación que tengo en mente. El método bar
espera un único argumento booleano ( :baz
), cuyo tipo se verifica para asegurarse de que realmente es un booleano:
module Foo
def self.bar(options = {})
baz = options.fetch(:baz, true)
validate_arguments(baz)
end
private
def self.validate_arguments(baz)
raise(ArgumentError, ":baz must be a boolean") unless valid_baz?(baz)
end
def self.valid_baz?(baz)
baz.is_a?(TrueClass) || baz.is_a?(FalseClass)
end
end
Uso algo similar a lo que JHurra publicó:
it "should raise ArgumentError for arguments that are not boolean" do
expect{ Foo.validate_arguments(nil) }.to raise_error(ArgumentError)
end
No es necesario alias (rspec 1.3).
it "should raise ArgumentError for arguments that are not boolean" do
lambda{ Foo.validate_arguments(something_non_boolean) }.should raise_error(ArgumentError)
end