Как мы тестируем организаторы интеракторов, используя rspec?

Я хочу проверить ниже органайзер организатора для вызова 2 указанных интеракторов без выполнения кода вызывающих интеракторов ('SaveRecord, PushToService').

class Create
  include Interactor::Organizer

  organize SaveRecord, PushToService
end

Я нашел несколько примеров, где был проверен общий результат всей логики взаимодействия (запись должна быть сохранена и отправлена ​​в другой сервис). Но я не хочу выполнять логику другого интерактора, так как они будут проверены как часть их отдельных спецификаций.

1. Is it possible to do so?
2. Which way of testing(testing the overall result/testing only this particular 
   organizer interactor behavior) is a better practise?

3 ответа

Решение

Я считаю, что нам нужно протестировать органайзер интерактора на наличие включенных интеракторов без выполнения включенных интеракторов. Я могу найти заглушку и проверить органайзер с помощью строк ниже

Для заглушки:

  allow(SaveRecord).to receive(:call!) { :success }
  allow(PushToService).to receive(:call!) { :success }

Тестировать:

it { expect(interactor).to be_kind_of(Interactor::Organizer) }
it { expect(described_class.organized).to eq([SaveRecord, PushToService]) }

Найденный call! method & organized variable из исходных файлов организатора интерактора, где он пытается вызвать и использовать внутри. Заглушка call! метод и тестирование organized Переменная выполнила мое требование.

Вы можете протестировать, как они называются и в порядке:

it 'calls the interactors' do
  expect(SaveRecord).to receive(:call!).ordered
  expect(PushToService).to receive(:call!).ordered
  described_class.call
end

См.: https://relishapp.com/rspec/rspec-mocks/docs/setting-constraints/message-order

Просто повторяю ответ user524740 .

Тестировать:

       it { expect(interactor).to be_kind_of(Interactor::Organizer) }
it { expect(described_class.organized).to eq([SaveRecord, PushToService]) }

interactorв данном случае это экземпляр класса Interactor или в синтаксисе Rspec:

      let(:interactor) { described_class.new }
Другие вопросы по тегам