Rspec Rake Задача, как проанализировать / симулировать пользовательский ввод? - PullRequest
0 голосов
/ 22 февраля 2019

В моем задании по рейку у меня есть:

namespace :example do
  desc "this does something"
  task :something, [:arg1] => :environment do |t, args|

   (some_irrelevant_code)

    print 'YES/ NO : '
    choice = STDIN.gets.chomp.upcase

    case choice
    when 'YES'
     do_something
     break
    when 'NO'
     break
    end

  end
end

В моей спецификации у меня есть:

require "spec_helper"
require "rake"

feature "Example" do
  before do
    load File.expand_path("../../../lib/tasks/example.rake", __FILE__)
    Rake::Task.define_task(:environment)
  end

scenario "something" do
 Rake.application.invoke_task("example:something[rake_args_here]")
end

Все работает нормально, хотя у меня возникают проблемы с поиском способа избежатьнабрать пользовательский ввод в консоли при запуске теста.

В основном я хочу, чтобы тест запустился и предполагал, что пользователь собирается набрать «ДА».

Пожалуйста, дайте мне знать, еслиУ вас есть решение для этого или направьте меня в правильном направлении.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Если вы используете STDIN, вы застряли, это константа.Стоит отметить, что использование STDIN не рекомендуется из-за этого ограничения.

Если вы используете $stdin, эквивалент глобальной переменной и современную замену, вы можете переназначить его:

require 'stringio'
$stdin = StringIO.new("fake input")

$stdin.gets.chomp.upcase
# => "FAKE INPUT"

Это означает, что вы можете в целях тестирования переделать $stdin.Вы захотите положить его обратно, однако это означает, что вам нужна обертка, подобная этой:

def with_stdin(input)
  prev = $stdin
  $stdin = StringIO.new(input)

  yield

ensure
  $stdin = prev
end

Итак, на практике:

with_stdin("fake input") do
  puts $stdin.gets.chomp.upcase
end
0 голосов
/ 22 февраля 2019

Вы должны заглушить STDIN объект, подобный этому STDIN.stub(gets: 'test')

или

allow(STDIN).to receive(:gets).and_return('test')

Если оба они не работают, попробуйте:

allow(Kernel).to receive(:gets).and_return('test')

...