当Express应用位于函数内部时,如何在Node.js中模拟Express?

时间:2018-07-20 17:44:02

标签: node.js unit-testing express mocha sinon

我有httpListener.ts,看起来像这样:

export function startListening() {
     const app = express();
     app
         .use(bodyParser.json())
         .post('/home/about', func1)
         .get('/user/product/:id', func2)
         .use(function (req, res) {
             res.status(404).send(`no routing for path ${req.url}`);
         })
         .listen(httpListenerConfig.port, () => {
             console.log('listening..');
         });
 }

我必须为func1func2(这些函数是私有的)编写单元测试,我想使用伪造的http请求来调用它们。.

有什么主意吗?

1 个答案:

答案 0 :(得分:0)

您可以使用诸如superTest之类的框架来测试http请求。 SuperTest需要快速应用程序,因此我正在导出该应用程序。 我将app.listen分配给服务器,以便测试后可以关闭服务器(server.close)。

httpListener.js

var express = require('express');
function startListening() {
    const app = express();
    app
        .get('/home/about', func1)
        .get('/user/product/:id', func2)
        .use(function (req, res) {
            res.status(404).send(`no routing for path ${req.url}`);
        })
        var server = app.listen(3001, () => {  //so the server can be closed after the test
            console.log('listening..');
        });
        module.exports = server; 
}
function func1 (req, res) {
    res.status(200).send('this is home - about page');
}
  function func2 (req, res) {
    res.status(200).send('this is product page');
}

startListening();

httpListener-test.js

var request = require('supertest');
describe('loading express', function () {
  var server;
  beforeEach(function () {
    server = require('./httpListner.js');
  });
  afterEach(function () {
    server.close();
  });
  it('responds to /home/about', function test(done) {
    request(server)
    .get('/home/about')
    .expect(200) //test status
    .expect('this is home - about page', done); //test the response string
  });
});

要在func1和func2上进行更多测试,您必须将它们导出以便可以进行测试。