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

Bar*_*240 6 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试这种方法:

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();
    });
});
Run Code Online (Sandbox Code Playgroud)

有没有办法为“createServer”方法创建一个有效的假实现?也许可以模拟一些请求?多谢!

小智 5

你想在这里测试什么逻辑?

这样一个简单的服务器具有足够的声明性,无需进行单元测试。

如果你想测试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();
    });
});
Run Code Online (Sandbox Code Playgroud)