简单节点http服务器单元测试

时间:2020-07-22 19:52:29

标签: node.js typescript jestjs

我用TypeScript创建了一个NodeJs http服务器,并用Jest对所有内容进行了单元测试,除了基类之外,服务器本身:

import { createServer} from 'http';
export class Server {

    public startServer() {
        createServer(async (req, res) => {
            if(req.url == 'case1') { 
               // do case1 stuff
            }
            if(req.url == 'case2') { 
               // do case2 stuff
            }
            res.end();
        }).listen(8080);
    }
}

我正在尝试这种方法:

import { Server } from '../../../src/app/Server/Server';
import * as http from 'http';
describe('Server test suite', () => {

    function fakeCreateServer() {
        return {}
    }

    test('start server', () => {
        const serverSpy = jest.spyOn(http, 'createServer').mockImplementation(fakeCreateServer);
        const server = new Server().startServer();
        expect(serverSpy).toBeCalled();
    });
});

有没有一种方法可以为'createServer'方法创建有效的虚假实现? 也许模拟一些请求? 非常感谢!

2 个答案:

答案 0 :(得分:2)

您要在这里测试什么逻辑?

这种简单的服务器足以声明它,而无需进行单元测试。

如果要测试是否调用了createServer 只需http

模拟jest.mock('http');模块

此类表达式被开玩笑地抬起,以使其比常规导入具有更高的优先级。 https://jestjs.io/docs/en/mock-functions#mocking-modules

import { Server } from '../../../src/app/Server/Server';
import * as http from 'http';

jest.mock('http', () => ({
  createServer: jest.fn(() => ({ listen: jest.fn() })),
}));

describe('Server', () => {

    it('should create server on port 8080', () => {
        const server = new Server().startServer();
        expect(http.createServer).toBeCalled();
    });
});

答案 1 :(得分:1)

也许您应该上课并测试一下。

Nodejs http.createServer返回一个server实例。服务器实例具有属性listening(如果服务器正在侦听请求,则为true),因此您可以从startServer方法返回服务器实例并测试server.listening属性。

此外,如果您要测试对服务器的不同响应和请求,建议您使用supertest

// server - it also works with plain http
const app = express();

app.get('/user', function(req, res) {
  res.status(200).json({ name: 'john' });
});

// test
describe('GET /user', function() {
  it('responds with json', function(done) {
    request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200, done);
  });
});