摩卡如何公开节点控制器函数来测试脚本

Mocha how to expose a node controller function to test script

本文关键字:函数 测试脚本 控制器 节点 何公开 摩卡      更新时间:2023-09-26

这是我的foo-controller.js

module.exports = function(params) {
    var router = require('express').Router();
    var db = params.db
    var controller = {};
    controller.getFoo = function (req, res) {
        // returns something
    }
    router.get('/foo', controller.getFoo);
    return router;
};

这是我的test.js.

var chai = require('chai');
var expect = require('chai').expect;
var bar = require('../api/controllers/bar/foo-controller');
console.log("Test", bar) // <- this returns the whole foo-controlelr.js
describe('Foo', function() {
    it('should blah blah', function() {
    });
});

但每次我使用bar.getFoo() <-我想测试的功能。它返回错误has no method 'getFoo'

访问控制器的 getFoo 函数需要通过 module.exports 导出此函数。但是上面的代码不会导出控制器,而是导出路由器,这完全没问题,因为路由器用于在 Express 中安装路由器。

为了测试控制器,您可以在自己的模块中拆分路由/路由定义和控制器:

foo-controller.js

module.exports = function(params) {
  var db = params.db
  var controller = {};
  controller.getFoo = function (req, res) {
    // returns something
  }
  return controller;
};

foo-router.js

var fooController = require('./foo-controller');
module.exports = function(params) {
  var router = require('express').Router();
  var controller = fooController(params);
  router.get('/foo', controller.getFoo);
  return router;
};

这使您能够在没有路由器的情况下测试控制器。

测试代码的另一种方法是进行"集成"测试,同时测试路由器和控制器。使用像supertest(https://github.com/visionmedia/supertest)这样的工具,你可以像这样编写集成测试:

var request = require('supertest');
var express = require('express');
var fooRouter = require('.path/to/router/foo');
describe('Foo', function() {
  it('should blah blah', function(done) {
    var app = express();
    app.use('/', fooRouter(params));
    request(app)
      .get('/foo')
      .expect(200)
      .end(function(err, res){
        if (err) throw err;
        done();
      });
    });
  });
});

此方法的优点是测试路由定义加上控制器。