Я пытаюсь написать простой тест для сценария ruby, который использует gets
, и у меня странное поведение.
Когда я запускаю тест с 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
Я узнал о тестировании ввода от этого вопроса
Сценарий gets.rb
выглядит как
puts "Hello, #{gets.chomp.capitalize}!"
Myтест выглядит как
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)>'