Ruby on rails 如何在rspec中对模块进行单元测试(resque调度程序作业)
我有一个(简化的)模块:(/app/jobs/checkpulse.rb) 我可以在rails控制台中使用它,它可以按预期更改所有机器 我正在尝试编写一个规范来测试它: (/spec/jobs/checkpulse_spec.rb) 每次测试都失败。我在CheckPulse模块中使用了puts来检查它,它在模块中具有预期的行为,但是当它从模块返回时,机器没有改变 我试过了,但也没用。我还尝试在测试环境中运行rails控制台,看看这是否是一个环境问题,但是模块在那里也工作得很好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控制台,看看这是否是一个环境问题,但是模块在那里也工作得很好 我花了一整天的时间
我花了一整天的时间在这上面,请帮帮我 首先,尝试遵循ruby和rails惯例。如果调用模块
CheckPulse
,则其文件名应为check_pulse.rb
。它将帮助您避免要求\u relative
。第二,在spec和模块中,您可以和不同的ruby对象交互,这两个对象都在写入数据库中的同一行。如果您更新一个对象,另一个对象将不会同步更新。您需要通过调用规范中的machine.reload
手动重新加载它
还有一些代码提示:
- 切勿全部使用
。如果数据库中有2k+记录,它将被卡住。要迭代所有数据库记录,请使用all.each
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