I have the following job:
class Test::MooJob < ApplicationJob
  queue_as :onboarding
  def perform
     avariable = Test::AragornService.build("a").call
     if avariable.status == true
        puts "job succeeded"
     end
  end
end
and the service looks like this:
module Test
  class AragornService
    def self.build(x)
      self.new(x)
    end
    def initialize(x)
      @x = x
    end
    def call
      10.times do
        Rails.logger.info @x
      end
      return ServiceResult.new :status => true, :message => "Service Complete", :data => @x
    rescue => e
      Bugsnag.notify(e, :context => 'service')
      return ServiceResult.new :status => false, :message => "Error occurred - #{e.message}"
    end
  end
end
I am trying to test it with the following spec:
# bundle exec rspec spec/jobs/test/moo_job_spec.rb
require "rails_helper"
describe Test::MooJob do
  subject(:job) { described_class.perform_later }
  subject(:job_now) { described_class.perform_now }
  let(:key) { "a" }
  it 'queues the job' do
    ActiveJob::Base.queue_adapter = :test
    expect { job }.to have_enqueued_job(described_class)
      .on_queue("onboarding")
  end
  it 'calls the aragorn service once' do
    allow(Test::AragornService.new(key)).to receive(:call).and_return(ServiceResult.new(:status => true))
    expect_any_instance_of(Test::AragornService).to receive(:call).exactly(1).times
    job_now
  end
end
Why is it that avariable value keeps returning nil I get the following error "undefined method `status' for nil:NilClass"
however, when I return a simple boolean,
allow(Test::AragornService.new(key)).to receive(:call).and_return(true)
It sets avariable value to true
here's the ServiceResult class:
class ServiceResult
  attr_reader :status, :message, :data, :errors
  def initialize(status:, message: nil, data: nil, errors: [])
    @status = status
    @message = message
    @data = data
    @errors = errors
  end
  def success?
    status == true
  end
  def failure?
    !success?
  end
  def has_data?
    data.present?
  end
  def has_errors?
    errors.present? && errors.length > 0
  end
  def to_s
    "#{success? ? 'Success!' : 'Failure!'} - #{message} - #{data}"
  end
end
 
                        
Its because you are just setting expections on a unrelated instance of
Test::AragornServicein your spec:This does nothing to effect the instance created by
Test::AragornService.buildYou can solve it by stubbing
Test::AragornService.buildto return a double: