使用 Jest 模拟请求标头模块
Posted
技术标签:
【中文标题】使用 Jest 模拟请求标头模块【英文标题】:Mocking Request Header module using Jest 【发布时间】:2018-02-24 02:31:39 【问题描述】:function createRequest(method)
const init =
method,
headers: new Headers(.....),
;
return new Request(url, init);
我在上述代码 (https://davidwalsh.name/fetch) 中使用了请求标头(带有 Fetch)
但是在使用 Jest 编写单元测试用例时,它给了我这个错误:ReferenceError: Headers is not defined
我是否需要模拟这些标准模块?我应该如何在单元测试用例中导入标头
【问题讨论】:
我也有同样的问题。你解决了这个问题吗? 【参考方案1】:我说是的,模拟 Headers 绝对是测试环境中的一种选择。 在我的特殊情况下,我只是像这样嘲笑它:
global.Headers = ()=>
如果您想根据 fetch 返回的响应来测试您的代码是否正常运行,这将非常有效。 如果您还需要检查是否发送了正确的标头,则需要更复杂的模拟,和/或可能需要针对您的网络方法的专门测试套件。
【讨论】:
工作正常,但我需要一个方法append()
在 Headers 对象中(它在代码中积极使用),我该如何设置它?
@ArthurKushman 你可以返回一个带有 append 定义的对象:global.Headers = ()=> append:()=>
这是我尝试做的第一件事,错误是:TypeError: headers.append is not a function, code: global.Headers = () => append:() =>
also tried to set 2 arguments to append - 没有任何帮助.使用它的方法测试标头的能力对我的应用程序来说至关重要,拥有这样的能力真是太好了。
@ArthurKushman 当然这不起作用,因为您的代码期望 Headers 有一个构造函数,我的错。查看有关 Class mocks 的 Jest 文档,它应该可以回答您的问题。
你找到工作代码了吗?我也陷入了困境。【参考方案2】:
我知道这是一个老问题,但是对于遇到这个问题的任何人(就像我一样),这对我有用:
// before running each test
beforeEach(() =>
// define `append` as a mocked fn
const append = jest.fn();
// set test `Headers`
global.Headers = () => (
append: append,
);
);
【讨论】:
【参考方案3】:在 jest 设置文件中添加 'import "isomorphic-fetch" ' 应该可以解决这个问题,因为这将使缺少的 dom API 在测试中可用
【讨论】:
以上是关于使用 Jest 模拟请求标头模块的主要内容,如果未能解决你的问题,请参考以下文章
使用 axios 执行经过身份验证的请求时,Jest 返回“网络错误”
使用正确类型使用 Jest 和 Typescript 模拟 Express 请求