Есть ли способ установить значение $? в макете в рубине? - PullRequest
7 голосов
/ 04 января 2011

Я тестирую некоторые скрипты, которые взаимодействуют с системными командами.Их логика зависит от кода возврата системных команд, то есть от значения $ ?.Итак, в качестве упрощенного примера сценарий может сказать:

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.)

Ответы [ 3 ]

10 голосов
/ 04 января 2011

РЕДАКТИРОВАТЬ: Используя предложение Денниса Уильямсона:

command = "(exit 21)"

и использовать if $?.exitstatus == 0 вместо if $? == 0

1 голос
/ 04 января 2011
module Stubbed
  def `(*args)
    super( "mycommand that returns the error code I want" )
  end
end

При необходимости включите это в ваш объект?

0 голосов
/ 19 декабря 2018

Вы можете запустить подпроцесс из тестов, который просто завершится с любым необходимым кодом. Это установит для вас код $?.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...