当摩卡testing失败时,它将一个对象logging到控制台

当我所有的testing通过,一切都按预期工作。 然而,当一个testing失败并且任何记者处于活跃状态时,赛跑者都会打印出一个代表追踪痕迹的对象,而不是我在屏幕截图中看到的格式不正确的错误消息

> mocha --reporter spec --ui bdd --ignore-leaks Site Routes GET /sites ✓ should return a 200 OK ✓ should be a JSON response ◦ should be an array: { "date": "Fri Apr 19 2013 16:09:20 GMT-0400 (EDT)", "process": { "pid": 34270, "uid": 1032026306, "gid": 116266774, "cwd": "/Users/squinn/Projects/armada", "execPath": "/usr/local/Cellar/node/0.10.4/bin/node", "version": "v0.10.4", "argv": [ "node", "/Users/squinn/Projects/armada/node_modules/mocha/bin/_mocha", "--reporter", "spec", "--ui", "bdd", "--ignore-leaks" ], "memoryUsage": { "rss": 55717888, "heapTotal": 51000320, "heapUsed": 22281672 } }, "os": { "loadavg": [ 1.7001953125, 1.66162109375, 1.58984375 ], "uptime": 374244 }, "trace": [ { "column": 10, "file": "/Users/squinn/Projects/armada/node_modules/should/lib/should.js", "function": "Object.Assertion", "line": 368, "method": "Assertion", "native": false }, { "column": 43, "file": "/Users/squinn/Projects/armada/test/route.sites.js", "function": "null.callback", "line": 47, "method": "callback", "native": false }, { "column": 21, "file": "/Users/squinn/Projects/armada/node_modules/request/main.js", "function": "", "line": 290, "method": null, "native": false }, { "column": 17, "file": "events.js", "function": "EventEmitter.emit", "line": 95, "method": "emit", "native": false }, { "column": 54, "file": "/Users/squinn/Projects/armada/node_modules/request/main.js", "function": "", "line": 278, "method": null, "native": false }, { "column": 20, "file": "events.js", "function": "IncomingMessage.EventEmitter.emit", "line": 117, "method": "EventEmitter.emit", "native": false }, { "column": 14, "file": "_stream_readable.js", "function": null, "line": 883, "method": null, "native": false }, { "column": 13, "file": "node.js", "function": "process._tickCallback", "line": 415, "method": "_tickCallback", "native": false } ], "stack": [ "AssertionError: expected [ { user: 'test',", " group: 'group',", " name: 'post-test',", " domain: 'localhost:9000',", " _id: '51718b214805d8fe83000003',", " __v: 0,", " modules: [],", " labels: [ 'Test' ] } ] not to be an instance of Array: expected [ { user: 'test',", " group: 'group',", " name: 'post-test',", " domain: 'localhost:9000',", " _id: '51718b214805d8fe83000003',", " __v: 0,", " modules: [],", " labels: [ 'Test' ] } ] not to be an instance of Array", " at Object.Assertion (/Users/squinn/Projects/armada/node_modules/should/lib/should.js:368:10)", " at null.callback (/Users/squinn/Projects/armada/test/route.sites.js:47:43)", " at null.<anonymous> (/Users/squinn/Projects/armada/node_modules/request/main.js:290:21)", " at EventEmitter.emit (events.js:95:17)", " at IncomingMessage.<anonymous> (/Users/squinn/Projects/armada/node_modules/request/main.js:278:54)", " at IncomingMessage.EventEmitter.emit (events.js:117:20)", " at _stream_readable.js:883:14", " at process._tickCallback (node.js:415:13)" ], "level": "error", "message": "uncaughtException" } npm ERR! Test failed. See above for more details. npm ERR! not ok code 0 

这是testing

 describe('GET /sites', function (){ var url = 'http://localhost:' + app.get('api').port + '/sites'; it('should return a 200 OK', function (done){ request(url, function (err, res){ res.should.have.status(200); done(); }); }); it('should be a JSON response', function (done){ request(url, function (err, res, body){ res.should.be.json; done(); }) }); it('should be an array', function (done){ request(url, function (err, res, body){ JSON.parse(body).should.not.be.an.instanceOf(Array); done(); }); }); }); 

任何线索,为什么我没有得到美丽的景色?

该对象由于asynchronous行为而被logging到控制台。 should.js正确抛出错误,但不作为done()callback的参数。 我通过在try / catch语句中包装来修复,所以我可以将错误传递给done()

 it('should return a 200 OK', function (done){ request(url, function (err, res){ try { res.should.have.status(200); } catch (e){ done(e); } }); }); 

您使用--ignore-leaks表明您使用的是过时的摩卡版本。 (这是因为改为--check-leaks 。)

使用npm install -g mocha安装最新版本。

另外,你似乎正在得到JSON记者。 检查你是否有一个test/mocha.opts文件,但我不明白为什么它不会被你的命令行参数覆盖。