0

I've got a class which is responsible for send a direct message on Slack to every reporter who has not updated his Jira ticket in 2 days. To send message, described class used send_message method (which underneath is HTTParty.post). I'mc using VCR gem but I don't know how to test such behaviour if at the end I'm not getting 2xx or 3xx code.

reporter_reminder_messenger

class ReporterReminderMessenger
    def call
      fetch_pending.each do |issue|
        send_message(issue)
      end
    end

    private

    def fetch_pending
      @fetch_pending ||= Jira::FetchPendingStatus.new.call
    end

    def send_message(issue)
      MessageSender.new(
        user_id: get_user_id(reporter_email(issue)),
        message: create_text_message(issue)
      ).call
    end

I was trying to check changes in MessageSender class (fetch_pending.count == 4 from ReporterReminderMessenger.call)

specs

RSpec.describe ReporterReminderMessenger do
  let(:reporter_reminder) { ReporterReminderMessenger.new.call }

  it 'returns only pending issues' do
    VCR.use_cassette('reminder_messenger') do
      expect { reporter_reminder }.to change { MessageSender }.by(4)
    end
  end
end

But I'm getting an error:

NoMethodError:
       undefined method `-' for Slack::MessageSender:Class
mr_muscle
  • 2,536
  • 18
  • 61

1 Answers1

0

I believe the issue is that you need to check for MessageSender.count. That said, I would probably not bother using VCR for this and just mock out the requests/responses. Something like:

subject(:reminder) { described_class.new }

let(:call)        { reminder.call }
let(:jira_status) { instance_double(Jira::FetchPendingStatus, call: jira_call) }
let(:jira_call)   { some_response_hash_or_whatever }

before do
  # Ensure any new object created will return the mocked jira_status object
  allow(Jira::FetchPendingStatus).to receive(:new) { jira_status } 
end

# I'm assuming the intention was to count the number of DB records created?
it { expect { call }.to change { MessageSender.count }.by(4) }

it 'fetches pending JIRA status' do
  expect(jira_status).to receive(:call)
  call
end

Aside, this code reads more or less like business logic and not really objects that need persisting; you may want to check out CollectiveIdea's Interactor Gem

Allison
  • 1,925
  • 1
  • 18
  • 25