Как использовать double для проверки обработки исключений при модульном тестировании в ruby на рельсах? - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу проверить мой метод отправки logi c в моем классе Client. У меня есть это до сих пор в моем файле client_spe c. Как я могу поднять и ошибка и проверить, что спасение вызвано, и ошибка записана в моем файле spe c. Я новичок в rspe c, но я полагаю, что могу использовать двойную проверку для регистрации вместо вызова фактического регистратора.

client_spe c .rb

describe Client do

 describe '#send' do 
   let (:subject) {Client.new}

   it 'raises and logs the exception'
       //how to test raising and logging of the error
   end
 end
end

client.rb

class Client
  include HTTParty 
  base_uri "https://www.example.com"
  format :json

  def send
    begin 
      response = HTTParty.get(url)
      if response.successful?
        response 
      else
        raise 'invalid response'
      end
    rescue HTTParty::Error => e 
      logger.warn(e.message)
    end
  end
end

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Итак, expect перед send - это способ проверить, будет ли тестируемый метод «запускать» или выполнять дополнительные операции, это способ сказать «когда я выполняю foo, я ожидаю, что» это " получилось". Есть способ обойти это, например:

subject.send
expect(logger).to have_received(:warn).with('foo')

Но я думаю, что этот способ новее, чем тот, который я предложил, я просто привык использовать предложенный.

Что касается насмешек и заглушек, то да, вы их не тестируете, потому что эти объекты выходят за рамки класса, на котором вы тестируете. Таким образом, Logger должен иметь свой собственный набор тестов, такой же, как для HTTParty, поэтому вы «имитируете» их поведение, чтобы протестировать свой класс, таким образом вы удалите зависимость между тестом и другими библиотеками ( или классы). Когда ваш модульный тест завершен, вы можете перейти к интеграционному тесту и проверить (извините за избыточность), что весь стек (или конечная точка, или контроллер, или «поток») выполняет то, что вы ожидаете.

0 голосов
/ 13 апреля 2020

да, вы можете заглушки HTTParty и logger, что-то вроде

let(:logger) { double('Logger') } 
let(:error) { HTTParty::Error.new('foo') }   

 before do
   allow(Logger).to receive(:new) { logger }
 end

(не уверен, какой регистратор вы используете)

и тогда вы можете сказать HTTParty, чтобы вызвать ожидаемую ошибку, например:

 context 'when there is a HTTParty error' do
   before do
     allow(HTTParty).to receive(:get).and_raise(error)
   end
   it 'logs the error' do
     expect(logger).to receive(:warn).with('foo')
     subject.send
   end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...