Rspec: Как проверить, что в каждом цикле вызывается метод класса? - PullRequest
0 голосов
/ 25 января 2019

В настоящее время я пытаюсь протестировать часть кода в моем рабочем классе rails, как показано ниже (упрощенная версия);

class SenderWorker
   include Sidekiq::Worker
   sidekiq_options :retry => 5

   def perform(current_user_guid)
      Rails.logger.info "Starting for user_guid: #{current_user_guid}"
      user = User.find_by!(guid: current_user_guid)
      team = Team.find_by!(uuid: user.team.uuid)
      profiles = team.profiles 
      profiles.each do |profile|
         SenderClass.new(profile,
                         user).send(User::RECALL_USER)
      end
      Rails.logger.info "Finishing for user_guid: #{current_user_guid}"
   end
end

Тесты, которые я написал, вот они, и они проходят;

context 'when something occurs' do
  it 'should send' do
    sender = double("sender")
    allow(SenderClass).to receive(:new).with(user_profile, current_user) { sender }
    expect(sender).to receive(:send)
    expect(Rails.logger).to receive(:info).exactly(2).times

    worker.perform(user.guid)
  end
end

Однако я не проверяю все звонки. Есть ли способ убедиться, что я проверяю все, что вызывается в цикле each do. Заранее спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Вы можете проверить, что :send получено ожидаемое количество раз.

Но я бы посоветовал вам упростить тест, используя метод класса для инкапсуляции этих сцепленных методов. Что-то вроде:

def self.profile_send(profile, user)
  new(profile, user).send(User::RECALL_USER)
end

Тогда:

def perform(current_user_guid)
  Rails.logger.info "Starting for user_guid: #{current_user_guid}"
  user = User.find_by!(guid: current_user_guid)
  team = Team.find_by!(uuid: user.team.uuid)
  profiles = team.profiles 
  profiles.each do |profile|
    SenderClass.profile_send(profile, user)
  end
  Rails.logger.info "Finishing for user_guid: #{current_user_guid}"
end

И теперь вы можете проверить, что SenderClass получает :send_profile X раз.

Затем вы можете добавить тест для SenderClass.send_profile, если вы действительно хотите проверить вызовы методов new и send, но затем вы можете проверить это один раз, вне цикла, и оба теста охватят то, что вы хотите .

...