6

次のシナリオは、私の問題をほぼ要約しています。

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
4

2 に答える 2

1

ここに2つのオプションがあります。

  1. 必要なコンテキストを挿入するために使用できるテスト対象システムにフックを作成します。この例では、テスト対象のコマンドラインアプリに「currenttime」パラメーターを追加できます。または、アプリの構成ファイルまたはデータベースで固定時間を指定します。多くのオプションがあります。これは、テストしているアプリを所有していて、そのような変更を加えることができることを前提としています。これはごくわずかな変更で済みます。たとえば、「現在の時刻」パラメータが指定されている場合は、Timecopを使用してその時刻の時刻をフリーズします。

  2. テスト対象のシステムをCucumberプロセスに組み込む方法を見つけてください。あなたの例では、に砲撃する代わりにruby -e "puts Time.now"、することができinstance_eval "puts Time.now"ます。より現実的には、アプリを使用できます。requireコマンドラインランナーが、実際に作業を行ういくつかのクラスの薄いラッパーである場合は、それらを直接呼び出すことができます。または、予想されるARGVパラメータを入力し、putsメソッドとrequireファイルだけをモックアウトできる場合があります。これにより、プロセスを実行するのに近い経験が得られますが、Timecopを効果的に使用できます。

于 2012-03-06T22:11:33.173 に答える
0

Arubaは、すべてを1つのプロセスで実行できるプロセス実行と呼ばれる機能もサポートしています。ただし、Rubyメソッドを呼び出してコマンドにシェルアウトするデフォルトの動作をオーバーライドすることで機能するため、Arubaを使用したRubyCLIのテストにほぼ排他的に制限されます。

これが私にとってどのように見えるかです-私はThorアプリケーションをテストするためにArubaを使用しています:

require 'aruba/cucumber'
require 'aruba/in_process'
require 'thor'
require 'thor/runner'

load 'Thorfile'

class ThorFriendlyMain
  def initialize(argv, stdin, stdout, stderr, kernel)
    @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
  end

  def execute!
    $stdin = @stdin
    $stdout = @stdout
    $stderr = @stderr
    Thor::Runner.start(@argv)
    $stdin = STDIN
    $stdout = STDOUT
    $stderr = STDERR
  end   
end     

Aruba.config.command_launcher = :in_process
Aruba.config.main_class = ThorFriendlyMain
于 2018-04-23T20:14:57.917 に答える