2013-08-07 55 views
0

如何使用vows.js乾淨地測試以下函數,旨在添加基於對象層次結構的express.js應用程序的路由,而不會破壞誓言對主題和誓言的分離?如何用誓言測試此功能?

var addRoutes = function(routeObject, app, path) { 

    var httpVerbs = ['get', 'post', 'put', 'delete']; 

    path = path || ''; 

    for(var property in routeObject){ 
     var routesAdded = false; 
     for (var verbIndex in httpVerbs) { 
      var verb = httpVerbs[verbIndex]; 
      var completePath, handler; 
      if (property === verb) { 
       if (typeof(routeObject[verb]) === 'function') { 
        handler = routeObject[verb]; 
        completePath = path; 
       } else { 
        handler = routeObject[verb].handler; 
        completePath = path + (routeObject[verb].params || ''); 
       } 
       app[verb](completePath, handler); 
       routesAdded = true; 
      } 
     } 
     if (!routesAdded) { 
      addRoutes(routeObject[property], app, path + '/' + property); 
     } 
    } 
}; 

測試應該確認在應用程序對象上調用對應於http動詞的函數。例如如果routeObject是:

{ 
    tracker: { 
     message: { 
      get: { 
       handler: function (req, res) { 
        res.send("respond with a resource"); 
       } 
      } 
     } 
    } 

} 

然後

app.get('/tracker/message', function (req, res) { 
          res.send("respond with a resource"); 
         }); 

應該叫。

回答

0

像這樣的東西應該工作:

var assert = require('assert'), 
    request = require('request'); 

var verbs = ['get', 'post', 'put', 'delete'], 
    app = require('your/app.js'), 
    port = 8080; 

// 
// Your route would look something like this 
// 
var example = { 
    tracker: { 
    message: { 
     get: { 
     status: 200, 
     body: 'respond with a resource' 
     } 
    } 
    } 
}; 

function testRoutes(suite, route, app, path) { 
    path = path || '/'; 
    Object.keys(route).forEach(function (key) { 
    if (~verbs.indexOf(key)) { 
     return testRoutes(suite, route[key], app, [path, key].join('/')); 
    } 

    var test = [key, path].join(' '); 
    suite[test] = { 
     topic: function() { 
     request({ 
      method: key, 
      uri: 'http://localhost' + port + path 
     }, this.callback); 
     }, 
     'should respond correctly': function (err, res, body) { 
     assert.isNull(err); 
     assert.equal(res.statusCode, route[key].status); 
     assert.equal(body, route[key].body); 
     } 
    } 
    }); 

    return suite; 
} 

var suite = vows.describe('api'); 
testRoutes(suite, example, app); 
suite.export(module); 
+0

謝謝你,有沒有辦法直接測試功能,而無需啓動快車嗎?我想存根應用程序對象,並檢查,得到,發佈等被調用適當。問題是我無法從發誓中獲得它。 – alexbirkett