Как написать модульный тест для метода, который возвращает объект в блок в RSpec - PullRequest
1 голос
/ 03 октября 2019

У меня есть класс, который реализует метод .call, который возвращает объект в блок, и я хотел бы узнать, как написать для этого модульный тест. Вот что у меня есть.

module A
  class B < Service
    def call(object_id:)
      @object = Something.find(object_id)
      @object.update(status: 'done')
      yield @object
    end

    def set_to_in_progress
      @object.update(status: 'in_progress')
    end
  end
end

class Service
  def self.call(*args); new.call(*args); end
end

Затем я использую это так:

A::B.call(obj) do |object|
  object.set_to_in_progress if some_other_condition?
end

Мне нужно написать модульный тест для метода call, который проверяет, находится ли статусизменился на сделано или в процессе. Вот что у меня есть:

RSpec.describe A::B, :unit do
  let(:object) { create(:something, id: 1, status: 'in_progress') }

  it 'updates the status to done' do
    described_class.call(object.id) do |???|
      ???
    end

    expect(object.status).to equal('done')
  end

  it 'updates the status to in progress' do
    described_class.call(object.id) do |???|
      ???
    end

    expect(object.status).to equal('in_progress')
  end
end

1 Ответ

0 голосов
/ 04 октября 2019

Вы можете вернуть объект в #call:

def call(object_id:)
  @object = Something.find(object_id)
  @object.update(status: 'done')
  yield @object
  @object
end    

Тогда в тесте вы можете сделать:

object = described_class.call(object.id)
expect(object.status).to eq('in_progress')
...