我在node.js中使用vows时出现奇怪的错误

时间:2012-11-16 03:00:49

标签: node.js testing express bdd vows

我正在尝试使用誓言使用BDD启动我的node.js项目。 然后我得到了这个奇怪的错误。

我试图用誓言写一个小路线测试,这是我原来的代码,

node_server.prototype.mainpage = function(callback) {
  http.get({host:'localhost', port:this.port, path:'/', agent:false}, function(res){
  callback(res.statusCode);
  });
}

以下是我写誓言的方法

vows.describe('Request to the server').addBatch({
'Should get http 200': {
      topic: function () {
        app_server.mainpage(this.callback)
      },

      'we get 200': function (statusCode) {
        app_server.close_server();
        assert.equal(statusCode, 200);
      }
  },
}).run(); // Run it

即使statusCode正确,誓言总是会报告意外错误,例如

» An unexpected error was caught: 200

所以我改变了我的主页功能

node_server.prototype.mainpage = function(callback) {
  http.get({host:'localhost', port:this.port, path:'/', agent:false}, function(res){
      callback("error", res.statusCode); // Here I added a err message in front of the status code.
  });
}

我还将我的测试套件更改为

'we get 200': function (err, statusCode) {

然后这个测试工作了! 我只是想知道这种奇怪的情况怎么会发生。我已经阅读了誓言的文档,但我没有找到任何地方,他们说我必须把2个参数放到cb而不是1。

给我一​​些线索! 提前谢谢!

1 个答案:

答案 0 :(得分:1)

Vows文档没有提到它,但它假设错误第一个回调模式,Node.js社区广泛采用。在此模式中,回调的第一个参数始终是错误。如果它为null或未定义,则表示异步操作成功。我建议将此模式用于所有自己的代码,即使该函数不会产生错误参数。

如果您自己使用此模式,则可以更轻松地使用其他库,例如async,这可以使复杂的应用程序更容易。