如何测试 "whenever "执行的行为?

问题描述 投票:0回答:2

我在Rails中使用 "whenever "来调度一个任务,我想找到一种方法来测试正在执行的行为。

有没有一种方法可以在测试中触发事件(比如RSpec),这样我就可以对结果进行断言?被执行的任务是一个类方法,它本身是可以工作的,因为我已经在Rails控制台中手动测试过了,但是有没有办法触发事件,让这个行为发生,我可以在configschedule.rb中断言它以同样的方式工作?

ruby-on-rails ruby rspec cron whenever
2个回答
0
投票

每当事件发生时"

与常规的规范运行相比,唯一改变的是系统环境,更具体的是环境变量。

你可以看到的命令,每当将安装在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"

但你不需要这些,因为 whenever 使用了一个很好的技巧:它使用了所有的命令来调用 /bin/bash -l -c. 这确保了它使用的是一个登录shell,它加载的是 ~/.bashrc 文件。所以任何在 bashrc 文件中导出的变量都可以在 cron 执行中访问。

另外,有些发行版(比如gentoo)在skel bashrc文件中有一个检查,如果shell没有交互,就会退出(所以如果cron中需要环境变量,你必须在它之前设置它们)。

类似环境的测试

要回答关于测试的问题,这可能不是一个好主意。这里与你的代码库无关,只与你的系统有关(同样,你也不会在你的规范中测试你的系统上安装了哪个版本的postgres或imagemagick)。

为了调试起见,你可以在调用rspec做这样的事情时,多少模拟一下cron中发生的事情。

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

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


0
投票

我使用了一个简单的技巧来申明我的期望,就像下面这样

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
© www.soinside.com 2019 - 2024. All rights reserved.