【问题标题】:Disable rake task's console output in Minitest在 Minitest 中禁用 rake 任务的控制台输出
【发布时间】:2018-10-29 15:21:38
【问题描述】:

我有一个 rake 任务,它为控制台提供一些输出。此输出可用于跟踪执行进度,并通过 puts 实现,如下所示:

task :clean => :environment do
  # Some code
  puts 'Doing work'
end

我已经用Minitest 编写了该任务的测试,它提供了与手动调用时相同的控制台输出。当我为项目运行整个测试套件时,这会弄乱“绿​​点”屏幕。

是否有在测试环境中禁用控制台输出的选项(puts 语句的效果)?或者,是否有另一种在手动运行任务时显示消息的方式,可以隐藏在测试环境中。

我已经探索了将puts 替换为Rails.logger.info 的选项。这可以根据环境进行配置,但它会将输出打印到日志中,而不是在运行任务的终端窗口中。

【问题讨论】:

    标签: ruby-on-rails rake minitest


    【解决方案1】:

    您可以暂时将STDOUT 重定向到/dev/null,然后再恢复。

    original_stdout = $stdout
    $stdout = File.open(File::NULL, 'w')
    
    # ... do your tests ...
    
    $stdout = original_stdout
    

    另一种方法是将当前直接在 Rake 任务中的代码放入某个描述的对象中,并使用具有默认值的依赖注入。例如:

    # your rake file
    task :clean => :environment do
      MyTaskObject.new.call
    end
    
    # my_task_object.rb
    class MyTaskObject
      attr_reader :io
    
      def initialize(io = $stdout)
        @io = io
      end
    
      def call
        # ...actions
        io.puts "output"
        # more actions...
      end
    end
    

    然后,您可以测试对象,并传入您自己的 I/O 对象来代替标准输出,而不是直接在测试中运行 rake 任务:

    test '...' do
      io = StringIO.new
    
      MyTaskObject.new(io).call
    
      # assert here as usual
    end
    

    这种方法的一个优点是使用 StringIO 可以让您查询io.string,因此您还可以根据需要测试输出的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2011-06-17
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多