2012-02-03 40 views
14

我正在使用Mocha测试我的应用程序。目前,我正在使用Makefiles,但我想切换到Cakefiles。当我通过Cake运行我的测试时,来自Mocha的颜色不会显示在控制台上。Node.js产生的颜色?

下面是一个例子:

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的情况下通过颜色?

+2

+1 - [谷歌搜索此](http://www.google.no/search?q=node+pass+colors+through+exec)只返回您的问题... – Hubro 2012-02-04 00:10:25

回答

25

问题是,像许多命令行程序一样,如果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) 

通常,当你生成一个进程,新的数据流分配给孩子的标准输入,标准输出,和标准错误。这意味着摩卡将检查这些流,看看它们不是终端,并禁用颜色。 customFds工作的原因是它将节点在process.stdinprocess.stdoutprocess.stderr的确切流传递给子进程,所以当mocha检查流是否为终端时,它们将是因为流是实际的终端。

我知道你正在寻找另一个解决方案,但我不认为你会找到一个解决方案。您要么明确地告诉摩卡使用颜色,要么摩卡需要认为它是流媒体终端,唯一真正的方法是通过customFds,如您所说,这已被弃用。

+0

Upvote for you as这工作。但具有'customFds'的解决方案在不修改Mocha的情况下工作。我想要一个不需要修改Mocha的类似解决方案。从Node文档中我不清楚'customFds'甚至会做什么。 – 2012-02-04 04:25:12

+0

我通过回答更新了customFds和一些更多信息的解释。 – loganfsmyth 2012-02-04 08:36:35

+0

感谢您的更新! – 2012-02-04 15:37:32

8

Node.js文档声称customFds已被弃用。有没有办法在不使用customFds的情况下通过颜色?

较新版本的节点指定文件描述符与对象的options对象的stdio属性。 http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

stdio甚至还包括一个方便的“继承”传递父母的文件描述符标准输出,标准错误标准输入到生成的过程值,和。使用“标准输入输出”,原来的呼叫......

mocha = spawn 'mocha', files, customFds: [0..2] 

...将成为...

mocha = spawn 'mocha', files, stdio: 'inherit' 

由于loganfsmyth解释说,这将传递给子进程的确切流,否定需要任何额外的代码来重定向摩卡的输出。

+0

这似乎工作 - 如果是这样,它迄今为止最干净的解决方案 – 2013-03-17 16:23:23

+3

不幸的是,'stdio:'inherit''有一个缺点。您无法捕获输出。它只是传递给终端。 – 2014-06-03 21:49:28

+1

很好的答案,可能是OP首先要做的! – xixixao 2014-06-06 01:23:32