在我的耙子任务中,我有:
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
尽管我在寻找避免在运行测试时不必在控制台中键入用户输入的方法时遇到了麻烦,但一切工作都很好。
基本上,我希望测试能够运行,并假设用户要键入“是”。
请告诉我您是否有解决方案,或者为我指明正确的方向。
谢谢。
答案 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')