8

システムコマンドとインターフェイスするいくつかのスクリプトをテストしています。それらのロジックは、システムコマンドのリターンコード、つまり$?の値に依存します。したがって、簡単な例として、スクリプトは次のように言うかもしれません。

def foo(command)
  output=`#{command}`
  if $?==0
    'succeeded'
  else
    'failed'
  end
end

これらのメソッドを適切にテストできるようにするために、カーネルのバッククォート呼び出しをスタブアウトして、$?を設定できるようにしたいと思います。バッククォート呼び出し後にメソッドのロジックから適切な動作が得られるかどうかを確認するために、任意の値に変更します。$?は読み取り専用変数であるため、以下は機能しません。

$? = some_number

私はいくつかの簡単なことをすることができます:例えば、$を設定しますか?ゼロまたは非ゼロに。たとえば、$を設定しますか?$ ?:の値に応じて、0または35212(とにかく私のシステムでは)のいずれかになります。

def fail_or_succeed(success)
  if success
    `echo foo`
  else
    `a-non-existent-command 2>&1`
  end
end

私が本当にやりたいのは$を設定することですか?ゼロや任意の非ゼロではなく、特定の値(たとえば、3、または122)に変更します。これを行う方法がわかりません。(重要な場合は、Test :: UnitとMochaを使用してテストしています。)

4

3 に答える 3

10

編集:デニスウィリアムソンの提案を使用して:

command = "(exit 21)"

if $?.exitstatus == 0の代わりに使用しますif $? == 0

于 2011-01-03T23:58:38.730 に答える
1
module Stubbed
  def `(*args)
    super( "mycommand that returns the error code I want" )
  end
end

必要に応じてこれをオブジェクトに含めますか?

于 2011-01-04T00:07:34.053 に答える
0

テストからサブプロセスを起動して、必要なコードで終了することができます。これにより、$?.exitstatusコードが設定されます。これは、製品コードから入手できます。

このような製品コードの場合:

def execute_something
  `my_command --parameter`
  $?.exitstatus == 0
end

$?.exitstatusあなたは:をあざけることができます

it 'should return false' do
  fork { exit 1 } # Change to whatever code you need
  Process.wait

  expect(@sut).to receive(:`).with('my_command --parameter')
  expect(@sut.execute_something).to be == false
end
于 2018-12-19T13:06:33.380 に答える