我正在使用Mocha来测试我的应用。目前,我正在使用Makefiles,但我想切换到Cakefiles。当我通过Cake运行测试时,Mocha的颜色不会显示在控制台上。
以下是一个例子:
task 'test', 'test project', (options) ->
fetchTestFiles './test', (err,files) ->
mocha = spawn 'mocha', files
mocha.stdout.pipe(process.stdout, end: false)
现在,我尝试这样做:
task 'test', 'test project', (options) ->
fetchTestFiles './test', (err,files) ->
mocha = spawn 'mocha', files, customFds: [0..2]
这很有效,但Node.js文档声称不推荐使用customFds
。有没有办法在不使用customFds
的情况下传递颜色?
答案 0 :(得分:26)
问题是,与许多命令行程序一样,mocha如果发现它输出的东西不是终端,将禁用颜色输出。这样做是因为否则如果您通过管道传输到文件,该文件将包含颜色控制序列以及显示的文本。
所以问题不在于节点,而在于mocha。在这种情况下的解决方案是mocha有一个--colors
参数来强制颜色输出。所以这应该有用。
task 'test', 'test project', (options) ->
fetchTestFiles './test', (err,files) ->
files.unshift '--colors'
mocha = spawn 'mocha', files
mocha.stdout.pipe(process.stdout, end: false)
通常,当您生成进程时,会为子进程的stdin,stdout和stderr分配新的数据流。这意味着mocha将检查这些流,看到它们不是终端,并禁用颜色。 customFds
工作的原因是它将节点在process.stdin
,process.stdout
和process.stderr
获得的确切流传递给子进程,因此当mocha检查流时是终端,它们将是因为流是实际的终端。
我知道你正在寻找另一个解决方案,但我不认为你会找到一个。你要么明确地告诉mocha使用颜色,要么mocha需要认为它的流是终端,唯一真正的方法是通过customFds
,这是你所说的弃用。
答案 1 :(得分:8)
Node.js文档声称不推荐使用
customFds
。有没有办法在不使用customFds
的情况下传递颜色?
较新版本的Node使用spawn的stdio
对象的options
属性指定文件描述符。
http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options
stdio
甚至包含一个方便的'inherit'值,用于将stdout,stdin和stderr的父文件描述符传递给生成的进程。使用'stdio',原始呼叫......
mocha = spawn 'mocha', files, customFds: [0..2]
......会变成......
mocha = spawn 'mocha', files, stdio: 'inherit'
正如loganfsmyth解释的那样,这会将确切的流传递给子进程,从而无需任何额外的代码来重定向mocha的输出。