Как эту функцию можно проверить с помощью обетов?

Как можно, чтобы следующая функция, предназначенная для добавления маршрутов в приложение 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");
                        });

должен быть назван.

1 ответ

Примерно так должно работать:

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);
Другие вопросы по тегам