Ruby on rails 如何在rspec中对模块进行单元测试(resque调度程序作业)

Ruby on rails 如何在rspec中对模块进行单元测试(resque调度程序作业),ruby-on-rails,unit-testing,rspec,resque,resque-scheduler,Ruby On Rails,Unit Testing,Rspec,Resque,Resque Scheduler,我有一个(简化的)模块:(/app/jobs/checkpulse.rb) 我可以在rails控制台中使用它,它可以按预期更改所有机器 我正在尝试编写一个规范来测试它: (/spec/jobs/checkpulse_spec.rb) 每次测试都失败。我在CheckPulse模块中使用了puts来检查它,它在模块中具有预期的行为,但是当它从模块返回时,机器没有改变 我试过了,但也没用。我还尝试在测试环境中运行rails控制台,看看这是否是一个环境问题,但是模块在那里也工作得很好 我花了一整天的时间

我有一个(简化的)模块:(/app/jobs/checkpulse.rb)

我可以在rails控制台中使用它,它可以按预期更改所有机器

我正在尝试编写一个规范来测试它: (/spec/jobs/checkpulse_spec.rb)

每次测试都失败。我在CheckPulse模块中使用了puts来检查它,它在模块中具有预期的行为,但是当它从模块返回时,机器没有改变

我试过了,但也没用。我还尝试在测试环境中运行rails控制台,看看这是否是一个环境问题,但是模块在那里也工作得很好


我花了一整天的时间在这上面,请帮帮我

首先,尝试遵循ruby和rails惯例。如果调用模块
CheckPulse
,则其文件名应为
check_pulse.rb
。它将帮助您避免
要求\u relative
。第二,在spec和模块中,您可以和不同的ruby对象交互,这两个对象都在写入数据库中的同一行。如果您更新一个对象,另一个对象将不会同步更新。您需要通过调用规范中的
machine.reload
手动重新加载它

还有一些代码提示:

  • 切勿全部使用
    all.each
    。如果数据库中有2k+记录,它将被卡住。要迭代所有数据库记录,请使用
    find\u each
  • 您可以使用
    update\u all
    ->
    Machine.update\u all(:column\u 1=>value\u 1,:column\u 2=>value\u 3)更新所有记录,而不是加载并更新每个记录
  • 避免在没有参数的方法中使用圆括号

可能很傻,但是如果在执行预期操作之前重新加载
机器(
机器.重新加载
),它会工作吗?在数据库中修改其状态之前,它正在加载
机器
var,所以可能它只需要刷新一下?是的,请参见下面,谢谢!期望(机器。重新加载。激活报警)。工作正常!谢谢我还重命名了这些文件,并更改为self.perform-without()。现在查看find_each.改为Machine.all.find_each do | Machine |。那么,这是否与all.each相同,只要记录数小于批量大小(默认值1000)?将文件名更改为check_pulse.rb并神奇地消除了require_relative。
module CheckPulse
  @queue = :heartbeat
  def self.perform()
    Machine.all.each do |machine|
      machine.update_columns(active_alarm: true) #do not want to touch updated_at
    end
  end
end
require "spec_helper"
require_relative '../../app/jobs/checkpulse'

describe "CheckPulse" do

  let(:user) { FactoryGirl.create(:user) }
  let!(:machine) { FactoryGirl.create(:machine, user: user, heartbeat_timeout: 5) }

  it "should change the machine to alarm mode" do
    CheckPulse.perform
    expect(machine.active_alarm).to be_true
  end
end