Puts语句不会将消息打印到控制台

时间:2014-08-05 14:21:44

标签: ruby rspec pageobjects

我在脚本中放了几个puts语句。但邮件没有打印出来;脚本正在传递这些语句。我观察执行进入rake的时刻puts在整个流程中都不起作用。

在规范助手

class Testbed
puts "Inside test bed" // This puts is printed
some code
some code
some code
some code
end

RSpec.configure do |config|
  puts "In side rspec config" // This puts is printed
   config.color = true
   config.tty = true
some code
some code
some code
some code
end

config.before(:all) do
    puts "in before all"//not printed

这里的puts个语句都没有打印输出。我在页面对象中puts,不考虑规范文件。

任何人都可以为此建议解决方法吗?

2 个答案:

答案 0 :(得分:3)

默认考虑puts输出的位置。 It uses $stdout除非您已将其告知use a different channel,例如:

File.open('foo', 'w') do |fo|
  fo.puts 'bar'
end

当它使用$stdoutSTDOUT时,一个调用程序,特别是在子shell中使用Ruby的程序,可以捕获输出并用它做它想做的事情。这是操作系统的一个功能。如果我有代码,则此代码保存在'test.rb'中:

puts 'foo'

并从shell调用它:

ruby /path/to/test.rb > /some/file.txt

输出将通过管道传输到/some/file.txt,我不会在控制台上看到它。同样,如果我有第二个应用程序调用第一个应用程序:

output = %x[ruby /path/to/test.rb]

变量output将包含从子shell的STDOUT中重新路由捕获的文本'foo'

有很多方法可以做到这一点,从使用反引号或%x[...]到使用popen或常规open命令中的管道到Open3中的方法。在打开文件时讨论文件名,IO docs说:

  

以“|”开头的字符串表示子进程。 “|”后面的字符串的其余部分被调用为具有连接到它的适当输入/输出通道的进程。

所以,问问我们为什么puts没有输出到你的控制台是不容易回答的,但你可以看到,如果有东西直接调用你的代码,那么它就很容易完成。

答案 1 :(得分:0)

  

任何人都可以为此建议解决方法吗?

首先,如何关注所有错误?

`<main>': undefined method `config' for RSpec:Module (NoMethodError)

您的代码执行此操作:

RSpec.configure do |config|
  puts "In side rspec config" // This puts is printed
  config.color = true
  config.tty = true
end

...并且配置变量仅在块内定义。但是你写下这个:

config.before(:all) do
  puts "in before all"//not printed
end

该代码不在块内,因此配置变量不存在。

接下来,before()只在其他测试之前执行 - 但是你没有测试,因为rspec输出显示:

$ rspec 1.rb 
Inside test bed
In side rspec config
No examples found.  #*********HERE


Finished in 0.00032 seconds (files took 0.0879 seconds to load)
0 examples, 0 failures   #*******HERE

试试这个:

class Testbed
  puts "Inside test bed" #This puts is printed
end

RSpec.configure do |config|
  puts "In side rspec config" #This puts is printed
  config.color = true
  config.tty = true

  config.before(:all) do
    puts "in before all" #?????
  end
end

#Here is an rspec test:

RSpec.describe do
  it "some test" do
  end
end

...

~/ruby_programs$ rspec 1.rb 
Inside test bed
In side rspec config
in before all   #Yeah!!
.

Finished in 0.00073 seconds (files took 0.4294 seconds to load)
1 example, 0 failures