2 Stimmen

Wie teste ich das Verhalten, das von "whenever" ausgeführt wird?

Ich verwende Whenever, um eine Aufgabe in Rails zu planen, und ich möchte einen Weg finden, das ausgeführte Verhalten zu testen.

Gibt es eine Möglichkeit, das Ereignis in einem Test (wie RSpec) auszulösen, damit ich Aussagen über die Ergebnisse machen kann? Die ausgeführte Aufgabe ist eine Klassenmethode, die an sich funktioniert, weil ich sie manuell in der Rails-Konsole getestet habe, aber gibt es eine Möglichkeit, das Ereignis auszulösen, damit dieses Verhalten auftritt und ich behaupten kann, dass es genauso in der config/schedule.rb funktioniert?

1voto

illusionist Punkte 9696

Ich habe einen einfachen Trick verwendet, um meine Erwartungen wie unten angegeben zu bestätigen

require 'spec_helper'
require 'whenever'

describe 'Schedule' do
  it 'sendet E-Mails am 10. jedes Monats vor 08 Uhr 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

0voto

kik Punkte 7667

Das "whenever Event"

Das einzige, was sich bei dem, was whenever umschließt (z. B. cron), im Vergleich zu Ihrem regulären Spezifikationslauf ändert, ist die Systemumgebung und genauer gesagt die Umgebungsvariablen.

Sie können die Befehle sehen, die whenever in cron installieren wird, indem Sie sein ausführbares Programm verwenden :

$ whenever

Cron startet immer mit einer Rohumgebung. Wenn Sie den Inhalt Ihrer Crontab überprüfen (mit crontab -e), sehen Sie oben Variablen, die gesetzt sind. Sie können dort zusätzliche Variablen setzen. Zum Beispiel :

SHELL="/bin/bash"
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
MAILTO="Ihr_Benutzer"                                                                                                                       
HOME="/home/Ihr_Benutzer"
RAILS_ENV="Produktion"

Sie sollten diese jedoch nicht benötigen, weil whenever einen cleveren Trick verwendet: Es ruft alle Befehle mit /bin/bash -l -c auf. Dies stellt sicher, dass es eine Anmeldeshell verwendet, die die Datei ~/.bashrc lädt. Daher sind alle Variablen, die in Ihrer Bashrc-Datei exportiert sind, innerhalb des Cron-Job-Ausführung zugänglich.

Beachten Sie auch, dass einige Distributionen (wie Gentoo) in der Skel-Bashrc-Datei einen Check haben, der beendet, wenn die Shell nicht interaktiv ist (daher müssen Sie Ihre Umgebungsvariablen einstellen, bevor Sie sie benötigen, wenn sie in cron benötigt werden).

Tests mit ähnlicher Umgebung

Um auf Tests zu antworten, ist dies wahrscheinlich keine gute Idee. Es gibt nichts, was mit Ihrer Codebasis zusammenhängt, sondern nur mit Ihrem System (ähnlich testen Sie nicht, welche Version von PostgreSQL oder ImageMagick auf Ihrem System installiert ist, in Ihren Spezifikationen).

Sie können zum Zweck des Debuggens irgendwie simulieren, was in cron passiert, während Sie rspec aufrufen, indem Sie Folgendes tun :

env - HOME=/home/Ihr_Benutzer/ /bin/bash -l -c 'rspec spec/'

Dies stellt sicher, dass die Umgebung geleert wird (env -), dann HOME als minimale Umgebung gesetzt wird und dann eine Anmeldeshell genau wie die Befehle von whenever aufgerufen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X