Arhn - архитектура программирования

Как проверить спасательный блок метода с помощью rspec mocks 3.3

Помогите мне пройти этот тест:

Вот пример некоторого кода rspec,

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

Я также создал скрипку с этими тестами, так что вы можете просто заставить их пройти. Пожалуйста, помогите мне протестировать спасательный блок метода!


Предыстория:

Мой первоначальный вопрос звучал примерно так:

У меня есть метод, например следующий:

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 , но мне тяжело.


Ответы:


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

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

21.08.2015
  • Это не отвечает на вопрос, как проверить спасательный блок метода. Кроме того, вы ссылаетесь на документы 2.14. Пожалуйста, смотрите мой вопрос для ссылки на соответствующие документы 3.3. 21.08.2015

  • 2

    Я неправильно понял, для чего на самом деле нужен синтаксис 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, так что дела повысятся.

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

    21.08.2015
  • не быть педантичным, но @p4sh4 ответил на ваш вопрос около 13 часов назад. 21.08.2015
  • Я не думаю, что он сделал! Он предоставил ссылку на документы, те же самые документы, на которые я сам дал ссылку. Он включил пример синтаксиса allow, но не то, как его использовать. Прочитав его ответ, я не почувствовал себя лучше подготовленным. Только после создания этого минимального примера я смог разобраться в этом самостоятельно. 21.08.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..