我正在使用Rails安排任务,我想找到一种方法来测试正在执行的行为。
有没有办法在测试中触发事件(比如RSpec),所以我可以对结果做出断言?执行的任务是一个类方法,它本身可以工作,因为我在Rails控制台中手动测试它,但有没有办法触发事件,以便这种行为发生,我可以断言它在config /中的工作方式相同schedule.rb?
答案 0 :(得分:1)
我使用一个简单的技巧来声明我的期望,如下所示
require 'spec_helper'
require 'whenever'
describe 'Schedule' do
it 'sends email 10th of each month before 08 AM EST' do
expected = "0 7 10 * * /bin/bash -l -c 'cd && script/rails runner -e production '\\''Delayed::Job.enqueue(MyMailerJob.new([2,3,4]), priority: 10)'"
expect(cron_output).to include(expected)
end
end
def cron_output
Whenever::JobList.new(file: Rails.root.join("config", "schedule.rb").to_s).
generate_cron_output.
gsub(Dir.pwd, '')
end
答案 1 :(得分:-1)
与常规规范运行相比,每当包装(即cron)时,唯一的变化是系统环境,更具体地说是环境变量。
您可以使用其可执行文件在cron中安装时查看命令:
$ whenever
Cron始终以原始环境开始。如果您检查crontab内容(使用crontab -e
),您将看到设置的顶部变量。您可以在那里设置其他变量。例如:
SHELL="/bin/bash"
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
MAILTO="your_user"
HOME="/home/your_user"
RAILS_ENV="production"
但是,您不应该需要这些,因为每当使用一个很好的技巧时:它使用/bin/bash -l -c
调用所有命令。这可以确保它使用登录shell,该shell加载~/.bashrc
文件。因此,在cronrc文件中导出的任何变量都可以在cron执行中访问。
另请注意,某些发行版(如gentoo)会检查skel bashrc文件,如果shell不是交互式的,则退出(因此如果在cron中需要它们,则必须在它之前设置环境变量)。
要回答有关测试的问题,这可能不是一个好主意。这里与您的代码库没有任何关系,只与您的系统有关(类似地,您没有在您的规范中测试系统上安装了哪个版本的postgres或imagemagick)。
为了调试起见,你可以在某种程度上模拟cron在调用rspec时会发生什么:
env - HOME=/home/<your_user>/ /bin/bash -l -c 'rspec spec/'
这将确保清空环境(env -
),然后将HOME设置为最小env,然后像命令一样调用登录shell。