2011-02-09 39 views
10

Tôi đang học về TDD trong khi viết một số chương trình ruby ​​nhỏ. Tôi có lớp học sau:Rspec không hoạt động hoặc không tăng lương?

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

và tôi đang cố gắng kiểm tra bằng thử nghiệm rspec này.

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 

Nó không bao giờ hoạt động và tôi không hiểu điều gì xảy ra với đầu ra 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)>' 

Tôi hy vọng đây là điều đơn giản mà tôi đang thiếu, nhưng tôi chỉ không nhìn thấy nó.

Trả lời

33

Nếu bạn đang kiểm tra ngoại lệ, bạn phải tách biệt khỏi thử nghiệm với lambda hoặc ngoại lệ sẽ phát sinh.

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

Chỉnh sửa: Kể từ khi người ta còn dùng câu trả lời này, đây là những việc cần làm trong rspec 3:

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

Lambda là không còn cần thiết vì mong đợi cú pháp mất một khối không bắt buộc.

+0

Điều đó hoạt động hoàn hảo, cảm ơn! – gdziengel

+2

Tôi đã sử dụng 'mong đợi (...) .' thay vì' mong đợi {...} .' và câu trả lời này cuối cùng đã giúp tôi tìm ra sai lầm! –

+0

Hãy nhớ rằng nếu bạn sử dụng dấu ngoặc đơn thay vì sử dụng một khối, ngoại lệ có thể phát sinh. Xem https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers Cú pháp khối nên được sử dụng để mong đợi ngoại lệ. –

Các vấn đề liên quan