我如何测试"每当执行的行为?"

时间:2014-06-26 12:34:56

标签: ruby-on-rails ruby rspec cron whenever

我正在使用Rails安排任务,我想找到一种方法来测试正在执行的行为。

有没有办法在测试中触发事件(比如RSpec),所以我可以对结果做出断言?执行的任务是一个类方法,它本身可以工作,因为我在Rails控制台中手动测试它,但有没有办法触发事件,以便这种行为发生,我可以断言它在config /中的工作方式相同schedule.rb?

2 个答案:

答案 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中需要它们,则必须在它之前设置环境变量)。

使用类似的env进行测试

要回答有关测试的问题,这可能不是一个好主意。这里与您的代码库没有任何关系,只与您的系统有关(类似地,您没有在您的规范中测试系统上安装了哪个版本的postgres或imagemagick)。

为了调试起见,你可以在某种程度上模拟cron在调用rspec时会发生什么:

env - HOME=/home/<your_user>/ /bin/bash -l -c 'rspec spec/'

这将确保清空环境(env -),然后将HOME设置为最小env,然后像命令一样调用登录shell。