使用 Jest 模拟 jsonwebtoken 模块

2024-04-02

我尝试用玩笑来模拟 npm 模块 jsonwebtoken 的验证功能。该函数返回一个已解码的令牌,但我想将此函数的自定义返回传递给我的单元测试。

我明确请求在继续请求之前检查访问令牌的有效性。但我想模拟令牌检查的时刻以直接返回用户值。并且轻松通过这一步。我把你关心的代码部分放在了你的位置。

但是打字稿给我发送了这个错误: 类型“{”上不存在属性“mockReturnValue”(令牌:字符串,secretOrPublicKey:秘密,选项?:VerifyOptions | 未定义):字符串|目的; (令牌:字符串,secretOrPublicKey:字符串 | 缓冲区 | { 密钥:字符串 | 缓冲区;密码:字符串;} | GetPublicKeyOrSecret,回调?:VerifyCallback | 未定义):void; (令牌:字符串,secretOrPublicKey:字符串 | ... ...'。

所以模拟不起作用,我不明白。我遵循 Jest.io 上的模拟 axios 步骤,但它似乎不适用于 jsonwebtoken。

每个人都知道问题是什么或者如何在 jest 上模拟这个 jsonwebtoken 模块吗?

用户.test.ts

import jwt from 'jsonwebtoken'
    jest.mock('jwt')
    jwt.verify.mockReturnValue({
                    userId: String(member._id),
                    email: String(member.email),
                    permissionLevel: member.permissionLevel,
                    username: String(member.username),
                })

describe('### /GET users', () => {
            it('it should return 200 (Users List)', async (done) => {
                const res = await request(app).set('Authorization', 'Bearer').get('/users')
                expect(res.status).toBe(200)
            })
})

验证.ts

public isAccessTokenValid = (req: Request, res: Response, next: NextFunction): void => {
        if (req.cryptedAccessToken) {
            try {
                req.accessToken = jwt.verify(req.cryptedAccessToken, ACCESS_TOKEN_SECRET)
                next()
            } catch (err) {
                res.status(498).send({ error: err.message })
            }
        } else res.status(401).send({ error: 'cryptedAccessToken field not present in request' })
    }

此致


我花了一段时间,但通过一些教训,我成功了。

  1. jest.mock('jsonwebtoken')需要使用,并且必须放在spec文件的顶部,紧接在import jwt from 'jsonwebtoken'.

  2. 这样做会模拟 jwt 的所有功能。就我而言,我只是想模拟验证。此代码解决了这个问题(替换上面的 (1))。

     import jwt from 'jsonwebtoken';
     jest.mock('jsonwebtoken', () => ({
     ...jest.requireActual('jsonwebtoken'), // import and retain the original functionalities
     verify: jest.fn().mockReturnValue({ foo: 'bar' }), // overwrite verify
     }));
    
  3. 然后我可以通过以下三种方式之一进行模拟验证:

a) 将其保留为默认模拟(返回 foo bar)。

b)使用mockReturnValue,但我需要指定要替换的重载(thx @Gabriel)。

  const verify = jwt.verify as jest.MockedFunction<
    (
      token: string,
      secretOrPublicKey: jwt.Secret,
      options?: jwt.VerifyOptions,
    ) => Record<string, unknown> | string;
  verify.mockReturnValue({ verified: 'true' });

c) 使用模拟实现:

 const verify = jest.spyOn(jwt, 'verify');
 verify.mockImplementation(() => () => ({ verified: 'true' }));

所有这些令人讨厌的事情是,现在对规范文件中的所有描述/它进行验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jest 模拟 jsonwebtoken 模块 的相关文章

随机推荐

  • 震动效果 - Flash CS6 ActionScript 3.0

    这个问题与 ActionScript 3 0 和 Flash CS6 有关 我试图让一个物体在一定时间内稍微摇晃几秒钟 我将其制作为 电影剪辑 并制作了以下代码 import flash events TimerEvent var Mach
  • 同一角度指令的多个实例会扰乱范围变量

    我在页面上多次使用该指令 例如 div div div div
  • Angular2 APP_INITIALIZER 嵌套 http 请求

    我一直在尝试使用APP INITIALIZER在引导过程中加载一些配置数据 类似于如何将从后端渲染的参数传递给 angular2 bootstrap 方法 https stackoverflow com questions 37611549
  • 如何在 Chrome 中使用 Selenium + Python 绑定控制文件的下载

    在哪里可以找到描述可与 Selenium 和 Chrome Web 浏览器一起使用的选项的文档 我想在网络浏览器中打开链接 以获取凭据 但不想下载相应的文件 pdf 或 tiff 或 jpeg 我在 Windows 7 笔记本电脑上使用 P
  • Excon::Errors::Forbidden in UsersController#update

    我正在尝试使用 Carrierwave 将图像上传到 Amazon S3 以便为我的用户提供上传头像的机会 当我添加图像文件并单击 更新 时 收到以下错误消息 Excon Errors Forbidden in UsersControlle
  • 如何使用 javascript 控制 Sass 变量

    我有一个正在生成 CSS 文件的 Sass 文件 我在 sass 文件中使用了许多变量作为背景颜色 字体大小 现在我想通过 JavaScript 控制所有变量 例如 在 style sass 中我们有 bg 000 font size 12
  • 命令行中转换命令出错

    我有一个 bash shell 脚本 如下所示 bin bash SIZES 512 1024 2048 for i in SIZES do SIZE SIZES i echo SIZE first resize original imag
  • 我需要 SQLBulkcopy 的进度条

    我的应用程序需要进度条 我正在通过文本文件将数据上传到 SQL Server 但这需要很多时间 而且我也使用了后台工作程序 但这不能正常工作 所以我只需要知道是否有任何方法可以将进度条与 SQL Bulk Copy 一起使用它告诉我插入了
  • Python:如何让程序等待函数或方法完成

    程序经常需要等待函数完成其工作 有时恰恰相反 主程序不需要等待 我举了一个简单的例子 有四个按钮 单击每个将调用相同的calculate 函数 唯一的区别是函数的调用方式 直接打电话 使用队列 每个线程完成后将结果放入队列中 然后您只需读取
  • 我必须使用 SVN API 或库访问/提交/更新 WPF 应用程序中的 SVN 存储库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何可用于从 net 应用程序访问 SVN 的好库 使用 C 到目前为止我发现的唯一 3 个我会尝试的
  • 如何使用 easy_install 安装 django 旧版本?

    我刚刚因为 django 1 3 破坏了我的环境 我的网站都无法运行 因此 我决定使用 virtualenv 来设置不同 python 版本以及 django 的虚拟环境 但是 似乎如果我下载软件包并使用 sudo python setup
  • 阵列部件访问

    我试图更好地理解数组 请原谅我的基本问题 因为我三周前刚刚打开我的第一本 php 书 我知道您可以使用 foreach 或 for 循环 检索键 值对 如下所示 stockprices array Google gt 800 Apple g
  • II 错误:应用程序代码隐藏=“Global.asax.cs”继承=“nadeem.MvcApplication”

    我正在尝试部署我的网络项目 但不断收到此错误 Line 1 我看了这个帖子 解析器错误 应用程序中的服务器错误 https stackoverflow com questions 11596352 line 1 application co
  • MySQL Regexp 是否支持 Unicode 匹配

    有谁知道Mysql的正则表达式是否支持unicode 我一直在做一些研究 大多数博客等似乎都表明存在问题或不受支持 我想知道是否最好使用 LIKE 进行 unicode 模式匹配 使用 regexp 进行 ASCII 增强模式匹配 我喜欢能
  • 具有非正则截距项的 Scikit-learn 岭回归

    scikit learn 岭回归是否在正则化项中包含截距系数 如果是 是否有办法在不正则化截距的情况下运行岭回归 假设我拟合岭回归 from sklearn import linear model mymodel linear model
  • RxJS forkJoin 未完成

    当我订阅 getAllSubModules 时 forkJoin 会毫无错误地执行所有这些可观察值 但不会完成 我知道 forkJoin 仅在其所有可观察值完成后才完成 但作为证据 我在控制台中看到 3 次 这确认一切都成功 因此所有可观察
  • jqGrid 过滤器工具栏仅显示单列的搜索运算符选择器

    我有包含许多列的 jqGrid 表 使用过滤器工具栏在网格中进行搜索 对于大多数人来说 搜索只是简单的默认运算符 对于一个日期时间列 我需要不同类型的运算符和日期选择器选择器 我已经添加了dataInit日期选择器初始化为searchopt
  • 如何将最后 N 次提交压缩在一起?

    如何将最后 N 次提交压缩为一次提交 你可以很容易地做到这一点 无需git rebase or git merge squash 在此示例中 我们将压缩最后 3 个提交 如果您想从头开始编写新的提交消息 这就足够了 git reset so
  • java/oops 中静态变量和动态变量有什么区别?

    请有人告诉我 oops 或 java 中 静态变量 和 普通变量 之间的区别 如果可能的话 还有它们的用法 考虑一个具有静态和动态变量的类 动态变量 创建类的实例时 每个对象都有自己的动态变量副本 对于每个对象 该变量的值都将不同 无论在该
  • 使用 Jest 模拟 jsonwebtoken 模块

    我尝试用玩笑来模拟 npm 模块 jsonwebtoken 的验证功能 该函数返回一个已解码的令牌 但我想将此函数的自定义返回传递给我的单元测试 我明确请求在继续请求之前检查访问令牌的有效性 但我想模拟令牌检查的时刻以直接返回用户值 并且轻