简单的Node.js HTTP服务器单元测试

5

我使用TypeScript创建了一个Node.js 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个回答

5

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

这样一个简单的服务器已经足够声明式,不需要进行单元测试。

如果您想测试 createServer 是否被调用了, 只需使用jest.mock('http');来模拟http模块。

这些表达式被jest提升,以使它们比常规导入具有优先级。 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
你好!非常感谢您的回复。我已经编辑了代码,使其更加清晰。在实现中,我根据接收到的req对象执行不同的操作,这基本上是我想要测试的内容。有没有一种方法可以在测试中发送一个模拟的req对象? - Barosanu240
1
如果我理解正确的话,如果您需要单独测试每个处理程序。只需将处理程序函数移动到HTTP结构之外(createServer等)。并且像纯函数一样测试这些处理程序。然后采用某些声明性方法将处理程序映射到URL上。我认为测试声明性代码没有太多意义。 - Alexander Alexandrov

2
也许你应该以稍微不同的方式来处理你的班级和考试。
Nodejs的http.createServer返回一个server实例。服务器实例有一个属性listening(如果服务器正在监听请求,则为true),因此您可以从startServer方法返回服务器实例并测试server.listening属性。
另外,如果你想测试对你的服务器的不同响应和请求,我建议你使用supertest
// 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);
  });
});

这个例子适用于 http.createServer 吗? - Dimitrios Desyllas
@DimitriosDesyllas 是的 - Ivan V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接