Rspec:无此类文件或目录@ rb_sysopen-

时间:2019-10-04 20:15:42

标签: ruby rspec

我正在尝试为使用gets的ruby脚本编写一个简单的测试,并且遇到一些奇怪的行为。

当我使用rspec运行测试时,它可以通过,但是只要运行带有任何标志(例如rspecrspec -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)>'  

1 个答案:

答案 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'),但是它已经过时了,我已经对其进行了更新。