2011-02-09 10 views
10

Pracuję nad uczeniem się TDD podczas pisania kilku małych programów ruby. Mam następujące klasy:Rspec nie działa, lub podbijać nie podbijając?

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

i próbuję przetestować go za pomocą tego testu 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 

Nigdy nie działa i nie rozumiem, co jest nie tak z wyjściem 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)>' 

Mam nadzieję, że to jest coś prostego, czego mi brakuje, ale po prostu go nie widzę.

Odpowiedz

33

Jeśli sprawdzasz wyjątek, musisz odseparować go od testu za pomocą lambda, inaczej wyjątek zostanie zbuforowany.

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

Edycja: Ponieważ ludzie nadal korzystać z tej odpowiedzi, o to co zrobić w rspec 3:

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

lambda nie jest już konieczne, ponieważ oczekują składnia pobiera opcjonalny blok.

+0

To działa idealnie, dzięki! – gdziengel

+2

Użyłem 'oczekiwać (...). Na' zamiast 'spodziewać {...}. Do' i ta odpowiedź w końcu pomógł mi znaleźć błąd! –

+0

Należy pamiętać, że jeśli użyjesz nawiasów zamiast używać bloku, wyjątek może się rozwinąć. Zobacz https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers Aby oczekiwać wyjątków, należy stosować składnię bloków. –

Powiązane problemy