React:如何模拟 Auth0 以使用 Jest 进行测试

2024-04-17

我正在使用 React(react-create-app 和 TypeScript)。使用 Auth0 进行登录。

我想用 Jest 编写测试,我发现这个资源基本上是唯一谈论模拟 Auth0 对象的资源。

所以我的代码如下所示:

import React from "react";
import ReactDOM from "react-dom";
import TopBar from "./index";
import {
  useAuth0
} from "react-auth0-spa";

const user = {
  email: "[email protected] /cdn-cgi/l/email-protection",
  email_verified: true,
  sub: "google-oauth2|12345678901234"
};

// intercept the useAuth0 function and mock it
jest.mock("react-auth0-spa");

describe("First test", () => {
  beforeEach(() => {
    // Mock the Auth0 hook and make it return a logged in state
    useAuth0.mockReturnValue({
      isAuthenticated: true,
      user,
      logout: jest.fn(),
      loginWithRedirect: jest.fn()
    });
  });

  it("renders without crashing", () => {
    const div = document.createElement("div");
    ReactDOM.render( < TopBar / > , div);
  });
});

但我最终陷入了这个错误:

Property 'mockReturnValue' does not exist on type '() => IAuth0Context | undefined'.ts(2339)

我在这里有点迷失,任何帮助将不胜感激!


我自己花了一个小时左右解决这个问题。问题源于修改模拟返回值后应用于 useAuth0 的错误类型。我的解决方案是使用“ts-jest/utils”中的模拟。您还可以将角色、范围等添加到用户对象。 (参见 adminUser 对象)

更新2022年11月21日 The mocked函数从ts-jest从版本 28.0+ 开始,软件包已被删除(请参阅mockedv27 文档 https://kulshekhar.github.io/ts-jest/docs/27.1/guides/test-helpers)

此功能现已弃用,并将在28.0.0。该功能已集成到jest-mock包作为 Jest 的一部分27.4.0, see https://github.com/facebook/jest/pull/12089 https://github.com/facebook/jest/pull/12089。请使用来自jest-mock反而。

import { render, screen } from "@testing-library/react";
import { useAuth0 } from "@auth0/auth0-react";

// if you're using jest 27.4.0+ and ts-jest 28.0.0+
import { mocked } from "jest-mock";

// if you're using ts-jest < 28.0.0
// import { mocked } from "ts-jest/utils";

const user = {
   email: "[email protected] /cdn-cgi/l/email-protection",
   email_verified: true,
   sub: "google-oauth2|12345678901234",
};

const adminUser = {
   email: "[email protected] /cdn-cgi/l/email-protection",
   email_verified: true,
   sub: "google-oauth2|12345678901234",
   "https://<<API_URL>>/roles": ["admin", "superuser"],
};


jest.mock("@auth0/auth0-react");
 
const mockedUseAuth0 = mocked(useAuth0, true);
 
describe("TopNav Component Tests - Logged in", () => {
   beforeEach(() => {
       mockedUseAuth0.mockReturnValue({
           isAuthenticated: true,
           user,
           logout: jest.fn(),
           loginWithRedirect: jest.fn(),
           getAccessTokenWithPopup: jest.fn(),
           getAccessTokenSilently: jest.fn(),
           getIdTokenClaims: jest.fn(),
           loginWithPopup: jest.fn(),
           isLoading: false,
       });
   });
   test("Logout Button displays when logged in", () => {
       render(
               <TopNav />
       );
       const loginButton = screen.getByText(/Logout/i);
       expect(loginButton).toBeInTheDocument();
   });
   test("Make sure Admin Panel Button doesnt show without Role", () => {
       render(
               <TopNav />
       );
       const adminPanelButton = screen.queryByText(/Admin Panel/i);
       expect(adminPanelButton).toBeNull();
   });
});

describe("TopNav Component Tests - Admin User", () => {
   beforeEach(() => {
       mockedUseAuth0.mockReturnValue({
           isAuthenticated: true,
           user: adminUser,
           logout: jest.fn(),
           loginWithRedirect: jest.fn(),
           getAccessTokenWithPopup: jest.fn(),
           getAccessTokenSilently: jest.fn(),
           getIdTokenClaims: jest.fn(),
           loginWithPopup: jest.fn(),
           isLoading: false,
       });
   });
   test("Admin Panel Button displays", () => {
       render(
               <TopNav />
       );
       const adminPanelButton = screen.getByText(/Admin Panel/i);
       expect(adminPanelButton).toBeInTheDocument();
   });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React:如何模拟 Auth0 以使用 Jest 进行测试 的相关文章

随机推荐

  • 如何从

    我有一个严重的问题 我想从标签中提取内容 例如 div class main content div class sub content Sub content here div Main content here div 我期望的输出是
  • 机器人按键在 Linux 中不工作

    我多次使用 Robot 类 但在 Windows 中没有遇到任何问题 但这次我使用的是 Fedora 如果我尝试一下 keyPress KeyEvent VK WINDOWS 它不工作 如何在linux Fedora 中模拟按Windows
  • Ninject 通过城堡动态代理拦截具有非空构造函数的代理类

    我当前的大部分实现都基于此处提供的信息 Ninject 拦截任何具有特定属性的方法吗 https stackoverflow com questions 6386461 ninject intercept any method with c
  • x11 - 导入错误:没有名为“kivy.core.window.window_x11”的模块

    当我尝试在我的 kali linux 操作系统中使用 python 3 5 运行任何 kivy 程序时 然后我收到以下错误 程序 from kivy app import App from kivy lang import Builder
  • 为什么 Gradle 或 Maven 没有依赖版本锁定文件?

    最近 在阅读 NPM Yarn Paket Cargo 等包管理器时 我了解到依赖版本锁定文件的概念 我的理解是 它是一个列出所有直接和传递依赖项及其确切依赖项的文件 版本号 因此保证后续构建使用一组等效的依赖项 这似乎是一个理想的功能 因
  • 无需越狱 iPhone 即可访问 /var/mobile/Containers/Data/Application 中的文件

    程序在 iPhone 上的目录 var mobile Containers Data Application 中记录一些消息 有什么方法可以在不越狱 iPhone 的情况下访问此目录 如果没有 iPhone 上是否有任何目录可以让我在不越狱
  • MySQL 调试工具查询速度慢? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有哪些免费工具可以用来查找MySQL的慢查询 除了记录慢速查询之外 需要详细分析慢查询 谢谢 凯瑟尔 U
  • 多处理管理器出现 EOFError

    我有很多客户端通过 0MQ 连接到服务器 我有一个管理器队列 用于工作人员池与每台客户端计算机上的主进程进行通信 在一台拥有 250 个工作进程的客户端计算机上 我几乎立即看到一堆 EOFError 它们发生在执行 put 时 我预计大量的
  • 有没有办法在 Spark 中随机排列集合

    我需要用 2 2 10 9 行打乱文本文件 有没有办法将它加载到 Spark 中 然后并行地洗牌每个分区 对我来说 在分区范围内洗牌就足够了 然后将其溢出回文件 要仅在分区内进行洗牌 您可以执行以下操作 rdd mapPartitions
  • 这个校验和算法可以改进吗?

    我们有一个非常旧的 不受支持的程序 可以跨 SMB 共享复制文件 它有一个校验和算法来确定文件内容在复制之前是否已更改 该算法似乎很容易被愚弄 我们刚刚找到了一个示例 其中两个文件完全相同 除了单个 1 更改为 2 之外 返回相同的校验和
  • 无法使用 mailR 包通过 Outlook.com 发送电子邮件

    我想用 mailR 用于发送带有身份验证的电子邮件通知的包 这个包的支持者是 rJava 并使用 Java 设施 我注册了 Outlook com 帐户 这是代码 library mailR email lt send mail from
  • 读取 3 个字节作为整数

    如何读取 3 个字节的整数 struct module 是否提供类似的东西 我可以读取 3 个字节并添加一个额外的 x00 然后将其解释为 4 字节整数 但这似乎没有必要 struct 模块没有 3 字节整数的选项 所以我认为附加 x00
  • 从 oauth 身份验证获取电子邮件 (Microsoft)

    如何从微软帐户获取电子邮件 我正在执行以下操作 public ActionResult ExternalLoginCallback string returnUrl AuthenticationResult result OAuthWebS
  • 在 R 中使用 geom_rect 进行时间序列着色

    我正在尝试对时间序列图的某个部分进行着色 有点像经济衰退阴影 类似于底部的图表 这篇关于 Excel 中的经济衰退阴影的文章 https research stlouisfed org tips 200511 recession bars
  • Java ArrayList 和 LinkedList - 在末尾添加元素实现细节

    我对为什么 arraylist 比链表更快的理解是 使用 arraylist 基本上只需要一个操作 更新末尾数组元素的引用 而使用链表你必须做更多的事情 例如创建一个新节点 更新 2 个引用 遍历链表并更新最后一个节点以指向新节点等 但是我
  • 如何使用函数减少值

    嘿 实际上我制作了一个 html 页面 其中有两个部分 当我单击第一部分时 数字会增加 当我单击第二部分时 第二部分中的数字会增加 我使用了 javascript 现在我在每个页面的底部做了一个按钮 我希望当我单击该按钮时 数字应该减少我尝
  • Google Drive Android API:已删除的文件夹在查询中仍然存在

    运行下面的代码 我在平板电脑上使用 Google Drive Android API 创建一个文件夹 几秒钟后 从 PC 上的远程位置删除该文件夹 当我重新运行代码时 API 仍然认为 MyFolder 存在 即使它已被删除并且在平板电脑上
  • 计算非图的所有可能突变[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要根据非常具体的配方构建一个非图解算器 对于每一行 我需要计算所有可能的突变 然后检查该行是否仍然使谜题有效 对于那些不知道非图的人 这
  • Xcode Storyboard 和 xib 连接

    我有一个包含许多视图控制器的故事板项目 我创建了一个名为 connecter h connector m 现在我可以将此类连接到一个 xib 文件吗 请帮我 您可以创建XIB当你创建时connector h and connector m通
  • React:如何模拟 Auth0 以使用 Jest 进行测试

    我正在使用 React react create app 和 TypeScript 使用 Auth0 进行登录 我想用 Jest 编写测试 我发现这个资源基本上是唯一谈论模拟 Auth0 对象的资源 所以我的代码如下所示 import Re