【发布时间】:2014-04-23 21:03:03
【问题描述】:
我有一个(简化的)模块:(/app/jobs/checkpulse.rb)
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
我可以在 Rails 控制台中使用它,它会按预期更改所有机器。
我正在尝试编写一个规范来测试它: (/spec/jobs/checkpulse_spec.rb)
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
此测试每次都失败。我在 CheckPulse 模块中使用了 puts 来检查它,它在模块内部具有预期的行为,但是当它从模块返回时,机器并没有改变。
我试过mixing the module into a dummy class,但也没有用。我还尝试在测试环境中运行 rails 控制台,看看是否是环境问题,但模块在那里也可以正常工作。
我花了一整天的时间,请帮忙!
【问题讨论】:
-
可能很傻,但是如果你在做期望之前重新加载
machine(machine.reload),它会起作用吗?它在修改数据库中的状态之前加载了machinevar,所以也许它只需要刷新? -
好的,见下文,谢谢!
标签: ruby-on-rails unit-testing rspec resque resque-scheduler