0

オブジェクト階層に基づいて Express.js アプリにルートを追加することを目的とした次の関数を、 vows.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");
                        });

呼び出す必要があります。

4

1 に答える 1

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);
于 2013-08-07T16:39:51.900 に答える