ruby-on-rails 如何在rake任务的上下文中使用rspec监视对象?

okxuctiv  于 2023-11-20  发布在  Ruby
关注(0)|答案(1)|浏览(166)

我有以下设置:

class Simple
  def self.test; end
end

task a_simple_job: :environment do
  counter = 0
  while counter < 2    
    Simple.test
    counter += 1
  end
end

require "rails_helper"
describe "a_simple_job" do
  subject { Rake::Task[:a_simple_job].invoke }
  before do
    Rails.application.load_tasks
    allow(Simple).to receive(:test)
    subject
  end

  # It seems like rspec cannot spy on objects created in the context of rake tasks
  it "calls test twice" do
    expect(Simple).to receive(:test).once
  end
end

字符串
为什么我得到:
(Simple(class)).test
预期:1次,带任何参数
已接收:0次,带任何参数
关于rake任务上下文和rspec,我是否遗漏了什么?

w3nuxt5m

w3nuxt5m1#

你应该使用have_received而不是receive,这是因为你已经在Assert之前调用了你的任务(因此也调用了Simple.test)。
参考:https://rubydoc.info/github/rspec/rspec-mocks/RSpec%2FMocks%2FExampleMethods:have_received
我让它在我的机器上工作。

# lib/tasks/simple_task.rake

task a_simple_job: :environment do
  counter = 0
  while counter < 2
    Simple.test
    puts "counter: #{counter}"
    counter += 1
  end
end
# lib/simple.rb

class Simple
  def self.test
    puts "test"
  end
end
# spec/lib/tasks/simple_task_spec.rb

require "rails_helper"
require "simple"

describe "a_simple_job" do
  subject { Rake::Task[:a_simple_job].invoke }
  before do
    Rails.application.load_tasks
    allow(Simple).to receive(:test)
  end

  it "calls test twice" do
    Rake::Task[:a_simple_job].invoke
    expect(Simple).to have_received(:test).twice # Because it is called twice in the loop
  end
end

这是测试结果。


的数据

相关问题