【问题标题】:Create IncomingMessage test dummy in Jest在 Jest 中创建 IncomingMessage 测试假人
【发布时间】:2021-08-24 06:21:43
【问题描述】:

我正在尝试为以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!'); 
});

我假设我需要关闭流,那么在将“虚拟”对象转换为类型 IncomingMessage 时我该怎么做?

我尝试过使用

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

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

TypeError: request.setTimeout 不是函数

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

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

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

【问题讨论】:

  • echo 'example' 是做什么的?它甚至是有效的 TypeScript 吗?
  • 糟糕,一些 bash 爬进来了。我修复了这个例子以使其更有意义

标签: node.js typescript unit-testing jestjs stream


【解决方案1】:

基本上你需要模拟你的请求对象,可以用下面的 sn-p 来完成:

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?')
    }
}

测试用例结果:

【讨论】:

  • @myol 上述解决方案能解决您的问题吗?
  • 不,我一直在寻找如何模拟 IncomingMessage,特别是使用流
  • @myol _mock_req 我相信函数会做同样的事情
  • mock_req里面可以传递请求流对象get: jest.fn(() => 'stream data')
猜你喜欢
  • 2010-10-13
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2016-02-20
  • 2018-04-27
相关资源
最近更新 更多