有时,使用supertest和jest测试Express时,响应是未定义的

时间:2017-10-29 13:21:32

标签: javascript node.js jest supertest

这是我的测试:

const request = require('supertest');
const makeRestController = require('../main/controller/restController');

const userRepository = {
    getCount: async () => {
        return 2;
    }
};
const logger = {
    info: () => {
    }
};

let appUnderTest = null;

beforeEach(() => {
    appUnderTest = makeRestController(userRepository, 8081, logger);
});

afterEach(() => {
    appUnderTest.server.close();
});

test('test count', function (done) {
    if(!appUnderTest) console.log("UNDEFINED!");

    request(appUnderTest.app)
        .get('/')
        .end(function (err, res) {
            if (err) return done(err);
            expect(res).toBeDefined();
            done();
        });
});

我用jest运行它。 我有一种奇怪的行为。

每次运行测试后,此测试都失败了:

 FAIL  __tests__/appWeb.js
  ● test count

    expect(received).toBeDefined()

    Expected value to be defined, instead received
      undefined

      at Test.<anonymous> (__tests__/appWeb.js:31:21)
      at Test.Object.<anonymous>.Test.assert (node_modules/supertest/lib/test.js:179:6)
      at Server.assert (node_modules/supertest/lib/test.js:131:12)
      at Object.onceWrapper (events.js:314:30)
      at emitNone (events.js:105:13)
      at Server.emit (events.js:207:7)
      at emitCloseNT (net.js:1648:8)
      at _combinedTickCallback (internal/process/next_tick.js:135:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

然后下一次,一切都是绿色,下一次是红色。 你能告诉我我做错了吗?

函数makeController返回{server, app},因为我需要在测试后关闭服务器,否则jest不会退出。

const express = require('express');

function makeRestController(userRepository, HTTP_PORT, logger) {
            const app = express();
            app.get('/', function (req, res) {
                userRepository.getCount().then((count) => res.send(`Count: ${count}`));
            });
            const server = app.listen(HTTP_PORT, function () {
                logger.info('App listening on port ' + HTTP_PORT + '!');
            });

            return {server, app};
}

module.exports = makeRestController;

我还做了另一次尝试,回复beforeEach做出类似这样的承诺:

test('test count', function (done) {
    if(!appUnderTest) console.log("UNDEFINED!");

    appUnderTest.then(x => {
        request(x.app)
            .get('/')
            .end(function (err, res) {
                if (err) return done(err);
                expect(res).toBeDefined();
                done();
            });
    });
});

但由于expect(res).toBeDefined();

,我仍然会失败

0 个答案:

没有答案