Как написать rspec для рельсовых заданий - PullRequest
0 голосов
/ 30 мая 2018

Привет, я работаю с проектом RoR с ruby-2.5.0 и rails 5. Я использую AWS SQS.Я создал задание следующим образом: -

class ReceiptsProcessingJob < ActiveJob::Base
  queue_as 'abc'

  def perform(receipt_id)
    StoreParserInteractor.process_reciept(receipt_id)
  end
end

Теперь я хочу написать для него модульный тест.Я пробовал как: -

# frozen_string_literal: true

require 'rails_helper'

describe ReceiptsProcessingJob do

  describe "#perform_later" do
    it "scan a receipt" do
      ActiveJob::Base.queue_adapter = :test
      expect {
        ReceiptsProcessingJob.perform_later(1)
      }.to have_enqueued_job
    end
  end
end

Но это не распространяется на StoreParserInteractor.process_reciept(receipt_id).Пожалуйста, помогите, как я могу покрыть это.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

На мой взгляд, вам не следует проверять сам ActiveJob, но логику, стоящую за ним.

Вы должны написать тест для StoreParserInteractor#process_reciept.Думайте о ActiveJob как о «внешней структуре», и вы не обязаны проверять ее внутренности (например, была ли работа поставлена ​​в очередь или нет).

Как сказал kitschmaster ,не тестируйте классы ActiveJob, короче

0 голосов
/ 30 мая 2018

Пример тестирования класса задания.Вам нужно написать спецификацию для StoreParserInteractor и протестировать метод process_reciept.

Что-то вроде (псевдокод):

describe StoreParserInteractor do
  describe "#process_receipt" do
    it "does that" do
      result = StoreParserInteractor.process_receipt(your_data_here)
      expect(result to be something)...
    end
  end
end

Но руководство Rails предлагает следующеевид теста:

assert_enqueued_with(job: ReceiptsProcessingJob) do
  StoreParserInteractor.process_reciept(receipt_id)
end

Может быть, это также увеличивает покрытие кода.

...