2015-08-20 7 views
0

Помогите мне сделать этот тест проход:

Вот пример некоторого 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, но мне тяжело.

ответ

0

Я не понял, что такое синтаксис allow на самом деле для. Таким образом, чтобы сделать мой пример спецификации передать, что мне нужно сделать это:

describe "#danger" do 
    context "when it rescues an exception" do 
    it "should increase the counter" do 
     allow($stdout).to receive(:puts).and_raise(IOError) # <----- here 

     expect { 
     subject.danger 
     }.to change(subject, :count).by(1) 
    end  
    end 
end 

Эта вещь, что я Штюбинга это не метод, или субъект, а объект, который может поднять. В этом случае я закрою $stdout, так что ставит рейз.

Вот еще fiddle, в котором проходят спецификации.

+1

не быть педантичным, но @ p4sh4 ответил на ваш вопрос около 13 часов назад. – engineerDave

+0

Я не думаю, что он это сделал! Он предоставил ссылку на документы, те же документы, которые я сам предоставил ссылку. Он включил пример синтаксиса 'allow', но не как его использовать. Прочитав его ответ, я не чувствовал себя лучше экипированным. Только после того, как я построил этот минимальный пример, я смог разобраться с этим сам по себе. – Ziggy

2
allow(something).to receive(:method_name).and_raise(SomeException) 

будет новый синтаксис allow. Оформить заявку the docs.

+0

Это не отвечает на вопрос, «как проверить тестовый блок метода». Кроме того, вы связаны с документами 2.14. См. Мой вопрос о ссылке на соответствующие документы 3.3. – Ziggy

+0

Возможно, вы можете использовать эту скрипту для создания проходящего теста? http://bit.ly/1NqI5Na – Ziggy