在RSpec中捕获STDOUT

我是Ruby的unit testing的新手,我在创建一个检查STDOUT的规范时遇到了一些麻烦。 我知道如果我正在测试的代码是在类/方法中,如何测试STDOUT,但我想测试一个来自常规Ruby文件的puts语句,该文件不属于Class或Method。

这是来自my_file.rb的简单一行

 puts "Welcome to the Book Club!" 

这是规格

my_spec.rb

 require_relative 'my_file.rb' describe "Something I'm Testing" do it 'should print Welcome to the Book Club!' do expect {$stdout}.to output("Welcome to the Book Club!\n").to_stdout end end 

我收到以下错误消息:

 Failures: 1) Something I'm Testing should print Welcome to the Book Club! Failure/Error: expect {$stdout}.to output("Welcome to the Book Club!\n").to_stdout expected block to output "Welcome to the Book Club!\n" to stdout, but output nothing Diff: @@ -1,2 +1 @@ -Welcome to the Book Club! # ./spec/my_spec.rb:9:in `block (2 levels) in ' Finished in 0.01663 seconds (files took 0.08195 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/my_spec.rb:7 # Something I'm Testing should print Welcome to the Book Club! 

我以为我可以使用$stdoutmy_file.rb捕获STDOUT,但这不起作用。 输出一直没有说什么。 我发现这篇文章讲的是通过StringIO 测试STDOUT输出来捕获输出

但这种方法对我不起作用。 我究竟做错了什么?

谢谢!

在测试运行之前,在顶部包含my_file.rb时, puts调用puts方法。 将其包含在您的测试中。

 describe "Something I'm Testing" do it 'should print Welcome to the Book Club!' do expect { require_relative 'my_file.rb' }.to output("Welcome to the Book Club!\n").to_stdout end end