express.js路由器单元测试错误

时间:2017-12-24 06:24:20

标签: javascript node.js unit-testing express

我有一个带有控制器和服务的节点/快速应用程序。通过Grunt/Jasmine运行控制器的单元测试时,测试运行正常,但在覆盖总结后我收到以下错误:

  

错误:SAVE状态错误TypeError:无法读取undefined的属性'apply'       在/node_modules/express/lib/router/index.js:603:14       在下一个(/node_modules/express/lib/router/index.js:246:14)       在下一个(/node_modules/express/lib/router/route.js:100:14)

Controller.js

var express = require('express'),
router = express.Router();
module.exports = function(app) {
  app.use('/api', router);
  router.post('/save', function(req, res, next) {
     // Service code is invoked here with the success/error callback
     // on success - res.json(response);
     // on error - res.status(err.status);
  });
}

ControllerSpec.js

var app = require('../mockApp'); // the app.js and the express app is mocked here
var httpMocks = require('node-mocks-http');
var request = require('request'); 
describe("Controller SAVE Action", function () {
   it("With Error", function () {
      spyOn(service, "save").andCallFake(function (req, res, headers, callback) {
      callback({category: "Error"});
      });
      var rout = app.getRouter("/state"); // the mocked app.js contains a getRouter function which returns the corresponding router which is simply express.Router()
      var request = httpMocks.createRequest({
        method: 'POST',
        url: '/save',
        headers: {"authorization": "success"}
      });
      var response = httpMocks.createResponse();
      rout(request, response);
      var data = JSON.parse(response._getData());
      expect(data.code).toEqual(400);
   });
});

Mocked app.js

var m = {};
var routers = {};
module.exports = {
 get: function (name) {
  return m[name];
 }, set: function (name, obj) {
  m[name] = obj;
 }, use: function (path, router) {
  if (router) {
    routers[path] = router;
  }
 }, getRouter: function (path) {
  return routers[path];
 }
};

Mocked Express.js

var app = require('./app'); // Mocked app.js
var services = {};
var serviceFiles = glob.sync(rootPath + '/app/services/*.js');
serviceFiles.forEach(function (file) {
  var service = require(file)(app);
  services[service.serviceName] = service;
 });
 app.set("services", services);

var controllers = glob.sync(rootPath + '/app/controllers/*.js');
controllers.forEach(function (controller) {
  require(controller)(app);
});

0 个答案:

没有答案