首页 > 解决方案 > 在 Jest 中创建 IncomingMessage 测试假人

问题描述

我正在尝试为IncomingMessage作为参数的函数编写单元测试。我知道它是一个流,但我不确定如何创建一个基本的测试假人,因为流会导致我的测试超时

:超时 - 在 jest.setTimeout.Timeout 指定的 5000 毫秒超时内未调用异步回调 - 在 jest.setTimeout.Error 指定的 5000 毫秒超时内未调用异步回调:

我的课

import { IncomingMessage } from 'http';

export class MyClass
  example(request: IncomingMessage): void {
    console.log(request.get('hello?'))
  }
}

我的测试

it('test', () => {
  const myclass = new MyClass();

  const request = {
    get: () => 'hello!'
  } as unknown as IncomingMessage

  const response = myclass.example(request);

  expect(response).toEqual('hello!'); 
});

我假设我需要关闭流,所以在将“虚拟”对象转换为 type 时该怎么做IncomingMessage

我尝试使用

const request = {
  get: () => 'hello'
} as unknown as IncomingMessage
request.setTimeout(1)

但后来我收到一个错误,提示找不到函数,这是有道理的,因为虚拟对象基本上是一个空对象,只有一个模拟函数

TypeError:request.setTimeout 不是函数

在这种情况下,我假设我需要实际创建一个真实的IncomingMessage? 但我找不到太多关于如何执行此操作的文档或示例

创建真实IncomingMessage流,快速关闭它并使用模拟get方法的最佳方法是什么?我想我需要模拟一个套接字?

或者在这种情况下测试我的类和功能的正确方法是什么?

标签: node.jstypescriptunit-testingjestjsstream

解决方案


基本上你需要模拟你的请求对象,可以用下面的代码片段来完成:

function _mock_req() {
    let req = {
        get: jest.fn(() => 'hello!'),
    };
    return req;
}

一旦模拟完成,在你的测试用例中调用它,我在这里使用beforeEach它来解决这个问题openHandler- Async callback was not invoked

describe('http test', () => {
    let req, res;
    const myclass = new MyClass();

    beforeEach((done) => {
        req = _mock_req();
        res = myclass.example(req);
        done();
    });

    it('class test', () => {
        expect(res).toEqual('hello!');
    });
});

您还需要request从课堂返回以通过测试。在执行测试用例时,您的模拟请求对象将从MyClass

export class MyClass {
    example(request: IncomingMessage): void {
        console.log(request.get('hello?'));
        return request.get('hello?')
    }
}

测试用例结果:

在此处输入图像描述


推荐阅读