Rspec не работает или рейз не поднимает? - PullRequest
13 голосов
/ 09 февраля 2011

Я работаю над изучением TDD, когда пишу несколько небольших программ на Ruby.У меня есть следующий класс:

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

Я надеюсь, что это что-то простое, что мне не хватает, но я просто не вижу этого.

1 Ответ

41 голосов
/ 09 февраля 2011

Если вы проверяете наличие исключения, вы должны отделить его от теста с помощью лямбды, иначе исключение будет всплывать.

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

Лямбда больше не нужна, потому что ожидаемый синтаксис занимает дополнительный блок.

...