Подтвердить что ты не робот

Rspec не работает, или рейз не поднимается?

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

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

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

4b9b3361

Ответ 1

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

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

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