2011-07-06 8 views
2

すぐに割引が期限切れになっていると、10時にユーザーに通知したいと思います。私は英雄の時間ごとのcronを使用しています。私はRuby 1.8.7でRails 3.0.9を使っています。私はlib/tasks/cronに次のcron.rakeを持っています。キュウリで定期的なcronジョブをテストする

# Notify users with expiring claims 
puts "Notifying users with expiring claims..." 
if Time.zone.now.hour == 10 
    Claim.expiring_tomorrow.reject(&:redeemed?).compact.each do |claim| 
    Mailer.delay.notify_customer_claim_expiration(claim) 
    claim.update_attribute(:expiration_notified, true) 
    end 
end 
puts "done." 

それは素晴らしいです。

Scenario: Not receiving a expiration reminder too early 
Scenario: Receiving a expiration reminder only once 
Scenario: Not receiving a reminder for a redeemed claim 

ので、私は以下の特徴を書いた:

And /^the hourly cron job exists$/ do 
    require "rake" 
    @rake = Rake::Application.new 
    Rake.application = @rake 
    Rake.application.rake_require "lib/tasks/cron" 
end 

And /^the hourly cron job has fired$/ do 
    Rake::Task["cron"].invoke 
end 
:以下cron.stepsステップ定義に

Feature: Being reminded that a claimed discount is expiring 

    Background: 
    Given the hourly cron job exists 

    Scenario: Not receiving a expiration reminder too early 
    And the hourly cron job has fired 

    Scenario: Receiving a expiration reminder only once 
    And the hourly cron job has fired 

    Scenario: Not receiving a reminder for a redeemed claim 
    And the hourly cron job has fired 

を私の問題は、私はキュウリにおける3つの異なるシナリオをテストしなければならないということです

各シナリオを個別に実行すると、それらは合格します。私は全体の機能を実行した場合、それが有する第二(いない最初の)シナリオに失敗:

RuntimeError: Don't know how to build task 'cron' 

レーキが最初のシナリオを超えて永続化されていないように見えるか、2番目のシナリオが実行される前にリセットする必要があります。 ..?

おかげで... G

答えて

0
Rake::Task[].invoke 

はrakeタスクが既に呼び出されているかどうかを確認し、ない場合は、それを実行します。つまり、複数回呼び出すとタスクを1回だけ実行します。

Rake::Task[].execute 

は、毎回タスクを呼び出すたびに実行されます。

+0

ありがとうポスト。私はこれをやっていました: –

1

ありがとうございます。私はこれをやり終えた:

And /^a cron job exists$/ do 
    require "rake" 
    @rake = Rake::Application.new 
    Rake.application = @rake 

    # remove cron.rake from list of required files to force file to be reloaded 
    loaded = $".reject {|file| file == Rails.root.join("lib", "tasks", "cron.rake").to_s } 

    Rake.application.rake_require("lib/tasks/cron", [Rails.root.to_s], loaded) 
    Rake::Task.define_task(:environment) 
end 

And /^the hourly cron job has fired$/ do 
    @rake["cron"].invoke 
end 
+0

あなたは[あなた自身の答えを受け入れる]べきです(http://blog.stackoverflow.com/2009/01/accept-your-own-answers/)。それはあなたの評判を上げることはありませんが、それはその質問が答えられていることを示します。 – Alex

関連する問題