在rails app中使用watchr的彩色输出

时间:2010-12-11 03:10:32

标签: ruby-on-rails ruby tdd

我在我的rails3应用程序中使用了watchr,因为我无法使自动测试正常工作。守望者一直很棒,但唯一的问题是我无法获得彩色输出。我将其用作我的watchr file

如果我通过“rspec spec /”手动运行我的测试,那么我会得到彩色输出。但是,让监视器运行测试(通过修改我的一个文件),输出不再是彩色的。

我注意到的一件事是这部分似乎以某种方式阻止了彩色输出

def run(cmd)
  puts(cmd)
  `#{cmd}`
end

通常情况下,watchr使用此命令运行测试(在我的watchr文件中)

result = run "rake spec"

但如果我改为做以下情况,我会得到彩色输出。

result = system "rake spec"

唯一的问题是上面的行不再将输出捕获到“结果”,这反过来又会使咆哮通知不再起作用。

关于我如何才能拥有两全其美的想法?咆哮通知和我的测试输出颜色?

3 个答案:

答案 0 :(得分:3)

我也遇到了这个问题。解决方案是在rspec命令行调用中除了--color之外还提供--tty选项,例如:

result = run("bundle exec rspec --color --tty #{spec}")

根据rspec google小组的this thread

  

--tty选项告诉RSpec输出正在流式传输到终端而不是文件,在这种情况下,即使调用了--color,我们也不想打印颜色代码。

如果您然后将结果“放回”到终端,您将看到原始着色。如果你想为Growl解析那个输出,你会想要使用Bill Turner提供的strip_ansi方法去掉ansi颜色代码。

希望有所帮助!

答案 1 :(得分:0)

这就是我在.watchr文件中的方式:

def run(cmd)
  `#{cmd}`
end

def run_spec_file(spec)
  system('clear')
  puts "Running #{spec}"
  result = run("bundle exec rspec #{spec}")
  puts result
  growl result.split("\n").last rescue nil
end

咆哮声是这样的:

def growl(message)
  growlnotify = `which growlnotify`.chomp
  unless growlnotify.empty?
    title = "Test Results"
    image = message.match(/\s0\s(errors|failures)/) ? "~/.watchr_images/ruby_green.png" : "~/.watchr_images/ruby_red.png"
    options = "-w -n Watchr --image '#{File.expand_path(image)}' -m '#{strip_ansi(message)}' '#{title}'"
    run("#{growlnotify} #{options} &")
  end
end

您希望开发框中的〜/ .watchr_images /目录中有一些图像,并且还安装了growlnotify binary

编辑:哦,你可能还想查看spec.opts文件中的内容(如果有的话) - 它可能没有指定--color

并且growl方法中的strip_ansi用于去除颜色代码,因此它将显示在咆哮声中。

def strip_ansi(m)
  m.gsub(/\e\[[^m]*m/, '')
end

答案 2 :(得分:0)

输出未显示颜色与将测试输出保存到变量有关。我有监视器设置它的方式将“rake spec”输出保存到变量,然后使用“puts”将该变量输出到终端。

def run(cmd)
  puts(cmd)
  `#{cmd}`
end

# what's called to run my tests
result = run "rake spec"

# then output it
puts result

现在我只需要弄清楚如何以彩色输出信息!