我正在尝试为使用gets
的ruby脚本编写一个简单的测试,并且遇到一些奇怪的行为。
当我使用rspec
运行测试时,它可以通过,但是只要运行带有任何标志(例如rspec
或rspec -f json
)的rspec -O rand
,测试就会失败,并且给我No such file or directory @ rb_sysopen - -O
,其中-O
是运行的标志。
奇怪的是,如果我运行rspec
并指定类似rspec spec/gets_spec.rb
的测试文件,则会收到完全不同的错误:
Failure/Error: expect { require_relative '../gets' }.to output("Hello, Lena!\n").to_stdout
expected block to output "Hello, Lena!\n" to stdout, but output "Hello, Describe \"gets.rb\" do!\n"
Diff:
@@ -1,2 +1,2 @@
-Hello, Lena!
+Hello, Describe "gets.rb" do!
# ./spec/gets_spec.rb:14:in `block (2 levels) in <top (required)>'
我在设法编写正确的测试方法时遇到了麻烦,因此不会发生这种情况,但是我不确定代码的哪一部分需要更改。
我正在使用ruby 2.6.3
我了解了如何测试来自this question的输入
脚本gets.rb
如下
puts "Hello, #{gets.chomp.capitalize}!"
我的测试看起来像
describe "gets.rb" do
before do
$stdin = StringIO.new("lena")
end
after do
$stdin = STDIN
end
it "should output 'Hello, name!'" , points: 1 do
allow($stdin).to receive(:gets).and_return("lena")
expect { require_relative "../gets" }.to output("Hello, Lena!\n").to_stdout
end
end
这是完整的失败消息:
Failures:
1) gets.rb should output 'Hello, name!'
Failure/Error: expect { require_relative '../gets' }.to output("Hello, Lena!\n").to_stdout
Errno::ENOENT:
No such file or directory @ rb_sysopen - -O
#./gets.rb:1:in `gets'
# ./gets.rb:1:in `gets'
# ./gets.rb:1:in `<top (required)>'
# ./spec/gets_spec.rb:14:in `require_relative'
# ./spec/gets_spec.rb:14:in `block (3 levels) in <top (required)>'
# ./spec/gets_spec.rb:14:in `block (2 levels) in <top (required)>'
答案 0 :(得分:1)
您可以尝试使用一些不同的方法:
describe "gets.rb" do
it "should output 'Hello, name!'" do
allow_any_instance_of(Object).to receive(:gets).and_return("lena")
expect { require_relative "../gets.rb" }.to output("Hello, Lena!\n").to_stdout
end
end
allow_any_instance_of
我来自https://makandracards.com/makandra/41096-stubbing-terminal-user-input-in-rspec
通常使用Kernel#gets读取控制台应用程序中的用户输入。
该页面建议使用Object.any_instance.stub(gets: 'user input')
,但是它已经过时了,我已经对其进行了更新。