2012-02-29 1 views
5

次のシナリオはかなりの合計を注入する方法:テストキュウリ/アルバ/ timecopとコマンドラインアプリケーション:私の問題まで、コンテキストに

Scenario: problems with subprocesses 
    Given the date is 01/01/2012 10:31 
    When I run `ruby -e "puts Time.now"` 
    Then the output should contain "10:31" 

それは子プロセスを起動し、これをすべて行うWhen I run ruby -e "puts Time.now"に沸きます私のTimecop.freezeスタブは効果がありません。なぜなら、それらはメインプロセスでしか動作しないからです。私はどういうわけか、実行中のコマンドに現在のコンテキストを「注入」する必要がありますが、私は何も思い付かないようです。ここで何かできないことをしようとしていますか


ステップ:

require 'timecop' 
Given /^the date is (\d+)\/(\d+)\/(\d+) (\d+):(\d+)$/ do |month, day, year, hour, minute| 
    Timecop.freeze(Time.local(year.to_i, month.to_i, day.to_i, hour.to_i , minute.to_i, 0)) 
end 

答えて

1

私はここに2つのオプションを参照してください。

  1. この例では、あなたがテストしているコマンドラインアプリに「現在の時間」のパラメータを追加することができ、あなたが必要なコンテキストを注入するために使用することができ、テスト中のシステムのフックを作成します。代わりに、アプリケーションの設定ファイルまたはデータベースに一定の時間を指定すると、多くのオプションがあります。これは、あなたがテストしているアプリケーションを所有しており、そのような変更を加えることができると想定しています。これは非常に小さな変化である必要があります。 「現在の時刻」パラメータが指定されている場合は、Timecopを使用してその時刻の時刻を固定します。

  2. 試験中のシステムをキュウリのプロセスに持っていく方法を見つけてください。あなたの例では、ruby -e "puts Time.now"に砲撃する代わりに、instance_eval "puts Time.now"とすることができます。もっと現実的には、アプリケーションをrequireにすることができます。コマンドラインランナーが、実際に作業を行っているクラスの周りに薄いラッパーであれば、直接呼び出すことができます。あるいは、ARGVパラメータの値を入力してputsメソッドを模倣し、そのファイルにはrequireというファイルを作成することができるかもしれませんが、それはプロセスを実行するのに近い経験を提供するはずですが、Timecopを効果的に使用することができます。

関連する問題