使用 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 模拟请求标头模块的主要内容,如果未能解决你的问题,请参考以下文章

用 Jest 模拟 jsonwebtoken 模块

使用 axios 执行经过身份验证的请求时,Jest 返回“网络错误”

使用正确类型使用 Jest 和 Typescript 模拟 Express 请求

在使用 jest 的 vue 测试中找不到模块“@jest/globals”

模拟服务工作者无法拦截网络请求

如何使用 python 请求模块创建自定义标头