Помогите мне сделать этот тест проход:
Вот пример некоторого Rspec кода,Как проверить спасательный блок метода с RSpec издевается 3,3
class User
attr_accessor :count
def initialize
@count = 0
end
# sometimes raises
def danger
puts "IO can be dangerous..."
rescue IOError => e
@count += 1
end
#always raises
def danger!
raise IOError.new
rescue IOError => e
@count += 1
end
end
describe User do
describe "#danger!" do
it "its rescue block always increases the counter by one" do
allow(subject).to receive(:'danger!')
expect {
subject.danger!
}.to change(subject, :count).by(1)
end
end
describe "#danger" do
context "when it rescues an exception" do
it "should increase the counter" do
allow(subject).to receive(:danger).and_raise(IOError)
expect {
subject.danger
}.to change(subject, :count).by(1)
end
end
end
end
Я также создал fiddle с этими тестами в нем, поэтому вы можете просто пропустить их. Пожалуйста, помогите мне проверить спасательный блок метода!
фона:
Мой первоначальный вопрос пошел что-то вроде этого:
У меня есть метод, как следующий:
def publish!(resource)
published_resource = resource.publish!(current_project)
resource.update(published: true)
if resource.has_comments?
content = render_to_string partial: "#{ resource.class.name.tableize }/comment", locals: { comment: resource.comment_content_attributes }
resource.publish_comments!(current_project, published_resource.id, content)
end
true
rescue Bcx::ResponseError => e
resource.errors.add(:base, e.errors)
raise e
end
И я хочу, чтобы проверить, что resource.errors.add(:base, e.errors)
фактически добавляет ошибку к ресурсу. В более общем плане, я хочу протестировать блок спасения в методе.
Так что я хотел бы написать код, как,
it "collects errors" do
expect{
subject.publish!(training_event.basecamp_calendar_event)
}.to change(training_event.errors.messages, :count).by(1)
end
Конечно, это вызывает ошибку, потому что я ре-рейз в спасательном блоке.
Я видел несколько ответов, которые используют старый something.stub(:method_name).and_raise(SomeException)
, но rspec жалуется, что этот синтаксис устарел. Я хотел бы использовать Rspec Mocks 3.3 и синтаксис allow
, но мне тяжело.
не быть педантичным, но @ p4sh4 ответил на ваш вопрос около 13 часов назад. – engineerDave
Я не думаю, что он это сделал! Он предоставил ссылку на документы, те же документы, которые я сам предоставил ссылку. Он включил пример синтаксиса 'allow', но не как его использовать. Прочитав его ответ, я не чувствовал себя лучше экипированным. Только после того, как я построил этот минимальный пример, я смог разобраться с этим сам по себе. – Ziggy