Rspec Rake Task如何解析/模拟用户输入?

时间:2019-02-22 17:35:52

标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec-rails

在我的耙子任务中,我有:

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 :(得分:3)

如果使用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

答案 1 :(得分:2)

您应该像这样STDIN存根STDIN.stub(gets: 'test')对象

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

如果它们都不起作用,请尝试:

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