2011-02-09 8 views
10

私はいくつかの小さなルビープログラムを書いている間、TDDの学習に取り組んでいます。私は次のクラスを持っています:Rspecが機能しない、または育てない?

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

そして私はこの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 

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)>' 

これは私が行方不明の単純なものだと思っていますが、私はそれを見ていないだけです。

答えて

33

例外をチェックする場合は、ラムダを使用してテストと区別する必要があります。例外が発生すると例外が発生します。

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

編集:人々はまだこの答えを使用しているので、ここではRSpecの3で何をするかではありません:

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

期待する構文は、オプションのブロックがかかるため、ラムダは、もはや必要です。

+0

これは完璧に動作します、ありがとう! – gdziengel

+2

私は 'expect {...}。to 'の代わりに' expect(...)。to'を使用しましたが、この回答は最終的に私が間違いを見つけるのを助けました! –

+0

ブロックを使用するのではなく括弧を使用すると、例外が泡立ちます。 https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchersを参照してください。例外を予期するためにブロック構文を使用する必要があります。 –

関連する問題