Rspec: нет такого файла или каталога @ rb_sysopen - - PullRequest
3 голосов
/ 04 октября 2019

Я пытаюсь написать простой тест для сценария 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)>'  

1 Ответ

1 голос
/ 05 октября 2019

Вы можете попробовать использовать немного другой подход:

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

Чтение пользовательского ввода в консольных приложениях обычно выполняется с использованиемЯдро # получает.

На странице предлагается использовать Object.any_instance.stub(gets: 'user input'), но синтаксис уже устарел, и я обновил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...