node.js - 在 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
方法的最佳方法是什么?我想我需要模拟一个套接字?
或者在这种情况下测试我的类和功能的正确方法是什么?
解决方案
基本上你需要模拟你的请求对象,可以用下面的代码片段来完成:
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?')
}
}
测试用例结果:
推荐阅读
- php - Apache 无法识别隐藏的 .index.php 文件
- mysql - 如何在一个查询中计算多个结果的最大值和最小值?
- python - Kivy - 运动事件:on_mouse_pos
- tensorflow - Tensorflow:“您必须使用 dtype float 和 shape [?,2] 为占位符张量 'y' 提供一个值”
- javascript - webpack4 css捆绑不适用于自定义样式名称
- python - “page”/create 发生冲突,因为 slug django
- scala - 上下文感知类型类
- apache-kafka - Kafka Offsets.storage
- anylogic - 返工产品所花费的时间 - Anylogic
- r - 如何检测以'abc'开头然后有'n'个数字然后再有字母的字符串?