Заглушка rspec and_raise и добавление сообщения

Я пишу тесты, которые должны проверить спасение в моем коде.

Код модели:

rescue Coinbase::Error => e
  #debugger
  if e == "You don't have that many bitcoins in your account to sell."
  ...
end

Код Rspec:

allow_any_instance_of(Order).to receive(:sell).and_raise(Coinbase::Error, "You don't have that many bitcoins in your account to sell.")

Добавление отладчика, где я сделал, и глядя на значение e в консоли вижу

#<Coinbase::UnauthorizedError: Coinbase::UnauthorizedError>

Таким образом, сообщение не передается.

Я гуглял на это последние 40 минут, и все, что я нашел, охватывает только отправку класса ошибки, а не сообщения. Предположительно, существуют ситуации, когда существует один и тот же класс ошибок, но разные сообщения.

Любые предложения будут великолепны. Спасибо!

2 ответа

Я думаю, что вы хотите сделать: Coinbase::Error.new("You don't have that many bitcoins in your account to sell.") внутри колл-рейза.

Обновление, я думаю, вы тоже хотите e.message == "" не e == "" потому что вы сравниваете ошибку со строкой, а не с сообщением об ошибке.

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

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

Камень Ferrum делает это много. Например, когда он вызывает ошибку Ferrum::BrowserError, первым аргументом является настраиваемый хэш ответа, который включает параметр «сообщение», так что заглушка выглядит примерно так:

      allow(ferrum_node).to receive(:focus).and_raise(
  Ferrum::BrowserError.new({ "message" => "Element is not focusable" })
)
Другие вопросы по тегам