Могу ли я заглушки "поднять" в Ruby? - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть класс с именем RemoteError с методом self.fatal.Эта методика заключается в том, чтобы перехватить исключение, отправить сведения об исключении на сервер и затем распространить исключение, чтобы убить программу.

class RemoteError
  def initialize(label, error)
    @label = label
    @error = error
  end

  def self.fatal(label, error)
    object = new(label, error)
    object.send
    raise error
  end

  def send
    # send the error to the server
  end
end

Я пытаюсь написать тесты для RemoteError.fatal метод.Это сложно из-за вызова raise в методе.Каждый раз, когда я запускаю свои тесты, raise явно вызывает исключение, и я не могу проверить, был ли вызван send.

  describe "fatal" do
    it "should send a remote error" do
      error = stub
      RemoteError.stub(:new) { error }
      error.should_receive(:send)

      RemoteError.fatal(stub, stub)
    end
  end

Есть ли способ, которым я могу заглушить или как-то обойти raiseдля этого конкретного теста?

Ответы [ 2 ]

9 голосов
/ 07 февраля 2012

Вы можете обернуть метод, который вызывает ошибку в лямбда-выражении ...

it "should send a remote error" do
  ...

  lambda { RemoteError.fatal(stub, stub) }.should raise_error(error)
end    

Это, по сути, позволяет вызывать метод, и вы получаете возвращаемое значение или возникшую ошибку, которую затем утверждаете с помощью .should raise_error(error). Это также делает так, что если нет ошибки , вызванной этим вызовом, тест не пройдёт нормально.

Чтобы сказать это по-другому, вам не нужно и не хотите заглушить raise. Просто оберните его в лямбду, и ваш код продолжит выполнение, вы должны быть в состоянии убедиться, что ваше сообщение отправлено, и ваш тест не завершится / вылетает.

3 голосов
/ 07 февраля 2012

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

lambda{ RemoteError.fatal(stub, stub) }.should raise_error

В этом случае ваша спецификация потерпит неудачу, если исключение не будет возбуждено, а также потерпит неудачу, если все другие ожидания (например, should_receive(:sen)) не будут выполнены.

...