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



我在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"方法创建一个有效的伪实现?也许可以模拟一些请求?非常感谢!

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

这样一个简单的服务器具有足够的声明性,可以在没有单元测试的情况下保持它。

如果要测试是否调用了createServerjest.mock('http');模拟http模块

这样的表达式被调侃起来,使其优先于常规导入。https://jestjs.io/docs/en/mock-functions#mocking-模块

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();
});
});

也许您应该以不同的方式对待您的类和测试。

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

此外,如果你想测试对服务器的不同响应和请求,我建议你使用超级测试

// server.js - it also works with plain HTTP
const app = express();
app.get('/user', function(req, res) {
res.status(200).json({ name: 'john' });
});
module.export = app
// test.js
const request = require('supertest');
const app = require('./server.js')
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);
});
});

最新更新