Заглушка 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" })
)