Rspec-rails: рдирдХрд╛рд░рд╛рддреНрдордХ `have_enqueued_job` рдПрдХ рд╣реА рддрд░рд╣ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рд╕рд┐рддре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rspec/rspec-rails

рдпрд╣рд╛рдБ рдореЗрд░реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИ:

require 'spec_helper'

class MyJob < ActiveJob::Base
  def perform
    OtherJob.perform_later
    OtherJob.perform_later
  end
end

class OtherJob < ActiveJob::Base
end

describe MyJob do
  subject(:my_job) { MyJob.new }

  it 'enqueues job' do
    expect { my_job.perform }.to have_enqueued_job(OtherJob).at_least(:once)
    expect { my_job.perform }.not_to have_enqueued_job(OtherJob)
  end
end

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, have_enqueued_job рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдареАрдХ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП expect { my_job.perform }.to have_enqueued_job(OtherJob) рд╕рдорд╛рди рд╣реИ expect { my_job.perform }.to have_enqueued_job(OtherJob).exactly(:once) ред

рд▓реЗрдХрд┐рди рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ expect { my_job.perform }.not_to have_enqueued_job(OtherJob) рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ expect { my_job.perform }.not_to have_enqueued_job(OtherJob).exactly(:once) ред рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ expect { my_job.perform }.not_to have_enqueued_job(OtherJob) рдПрдХ рд╣реА рддрд░рд╣ рдХреЗ рдХрдИ рдХрд╛рдо рд╣реЛрдиреЗ рдкрд░ рд╕рдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИред

рдЖрд░рдПрд╕рдкреАрд╕реА-рд░реЗрд▓ 3.6.1 рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

expect{ my_job.perform }.to have_enqueued_job(OtherJob).exactly(0).times

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП , рдХреНрдпреЛрдВрдХрд┐ expect { my_job.perform }.not_to have_enqueued_job(OtherJob) рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХреЛрдИ рдиреМрдХрд░реА рдирд╣реАрдВ рдХреА рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИред рдЙрдореНрдореАрджреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХрд╛ рдХреЛрдИ рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧреБрдЬрд░рддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред

рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ expect { my_job.perform }.to have_enqueued_job(OtherJob).at_least(:once) рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ expect { my_job.perform }.not_to have_enqueued_job(OtherJob) рдЧреБрдЬрд░рддрд╛ рд╣реИ

рдореБрдЭреЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

expect{ my_job.perform }.to have_enqueued_job(OtherJob).exactly(0).times
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jenskutilek picture jenskutilek  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

paulwalker picture paulwalker  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dwightwatson picture dwightwatson  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mlapshin picture mlapshin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mhenrixon picture mhenrixon  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ