2011-02-09 13 views
10

Estoy trabajando en aprender TDD mientras escribo algunos pequeños programas de ruby. Tengo la siguiente clase:Rspec no funciona, ¿o no sube?

class MyDirectory 
    def check(dir_name) 
    unless File.directory?(dir_name) then 
     raise RuntimeError, "#{dir_name} is not a directory" 
    end 
    end 
end 

y estoy tratando de probarlo con esta prueba rspec.

describe MyDirectory do 
    it "should error if doesn't exist" do 
    one = MyDirectory.new 
    one.check("donee").should raise_exception(RuntimeError, "donee is not a directory") 
    end 
end 

Nunca funciona, y no entiendo lo que está mal en la salida de rspec.

Failures: 

    1) MyDirectory should error if doesn't exist 
    Failure/Error: one.check("donee").should raise_error(RuntimeError, "donee is not a directory") 
    RuntimeError: 
     donee is not a directory 
    # ./lib/directory.rb:4:in `check' 
    # ./spec/directory_spec.rb:9:in `block (2 levels) in <top (required)>' 

Espero que esto sea algo simple que me falta, pero simplemente no lo estoy viendo.

Respuesta

33

Si está buscando una excepción, tiene que separar eso de su prueba con lambda o la excepción aumentará.

lambda {one.check("donee")}.should raise_error(RuntimeError, "donee is not a directory") 

Editar: Dado que las personas siguen utilizando esta respuesta, aquí es qué hacer en Rspec 3:

expect{one.check("donee")}.to raise_error(RuntimeError, "donee is not a directory") 

La lambda ya no es necesario porque la sintaxis toma un bloque opcional esperar.

+0

Eso funciona perfectamente, gracias! – gdziengel

+2

Utilicé 'expect (...). To' en lugar de' expect {...}. To' y esta respuesta finalmente me ayudó a encontrar el error. –

+0

Tenga en cuenta que si usa el paréntesis en lugar de usar un bloque, la excepción puede aparecer. Consulte https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers. La sintaxis del bloque se debe usar para esperar excepciones. –