如何更改 Jest 中模拟模块中函数的模拟实现

2023-12-31

我有一个看起来像这样的 utils 文件

// utils.js
const getNextDate = (startDate) => moment(startDate, 'MMM Do YYYY').startOf('day').add(10, 'days').format('MMM Do YYYY');
const getDisplayName = (user) => {
  if (user.type === 'admin') {
    return 'Admin';
  } else if (user.type === 'guest') {
    return 'Guest'
  } else if(user.type === 'user') {
    return `${user.firstname} ${user.lastname}`
  } else {
    return 'No user'
  }
}

export {
  getNextDate,
  getDisplayName
}

我的 utils 文件中也有一个模拟mocks我在其中实现模拟返回值以进行测试的文件夹。它看起来像这样

// mock/utils.js
export const getNextDate = () => 'Oct 20th 2020';
export const getDisplayName = (user) => user

在我的组件和测试中,我正在做这样的事情

//Component.js
import React from 'react';
import { getNextDate, getDisplayName } from './utils'

export const Component = () => {
  const user = {
    type: 'admin',
    firstname: 'john',
    lastname: 'doe',
  }
  return (
    <div>
      <div>{getDisplayName(user)}</div>
      <div>{getNextDate(moment())}</div>      
    </div>
  )
}

// Component.test.js
import { Component } from '../Component'
jest.mock('./utils', () => require('./mock/utils'));

describe('Component', () => {
  beforeEach(() => {
    wrapper = shallow(
      <Component />
    );
  });

  it('renders next date', () => {
      // At this point, I want to change the mock return value of getNextDate to Dec 25th 2020 without changing it in mock/utils.js as other tests are using that value
      expect(wrapper.find('.date').text()).toEqual('Dec 25th 2020');
  });
});

但是,在其中一个测试用例中,我试图更改getNextDate。既然我不能直接打电话,我该如何完成这件事getNextDate.mockImplementation()直接地?


jest.mock('./utils', () => require('./mock/utils'))重新发明现有的 Jest 功能,__mocks__手动模拟 https://jestjs.io/docs/en/manual-mocks#mocking-user-modules.

它应该是__mocks__/utils.js与原始模块处于同一级别并使用 Jest spies 以使实现可更改:

export const getNextDate = jest.fn(() => ...);
export const getDisplayName = jest.fn(() => ...);

考虑到__mocks__提供默认的模拟,它们不应该被覆盖mockImplementation对于特定的测试,因为这会影响后续的测试。相反,应该针对特定调用来模拟它*Once。对于在中指定的包装器beforeEach并且对于几个测试来说是常见的:

import { getNextDate } from './utils';
jest.mock('./utils')

...

  beforeEach(() => {
    wrapper = shallow(<Component />); // uses default mock
  });

  it('renders next date', () => {
    getNextDate.mockReturnValueOnce(...);
    wrapper.setProps({}); // update with new mock
    expect(wrapper.find('.date').text()).toEqual('Dec 25th 2020');
  });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 Jest 中模拟模块中函数的模拟实现 的相关文章

随机推荐

  • Eclipse 错误:解析 ...\android-22\android-wear\armeabi-v7a\devices.xml 时出错

    最近 我将 android SDK 升级为Android M API 22 MNC 预览版 之后每个项目打开Eclipse都报错 的错误为logcat and of 弹出窗口 says 错误 解析错误 sdk system images a
  • TaskScheduler.UnobservedTaskException 事件处理程序从未被触发

    我正在阅读一本有关 C 任务并行库的书 并有以下示例 但 TaskScheduler UnobservedTaskException 处理程序从未被触发 谁能给我任何线索来解释为什么 TaskScheduler UnobservedTask
  • 如何在 iOS 上启用新的 Objective-C 对象文字?

    当我使用 Xcode 4 4 创建一个新项目并添加以下行时 NSDictionary test key test value NSString value test key NSLog value is value 它编译时没有警告并按预期
  • jQuery 快速问题:停止事件传播?

    我有一组响应 mouseUp 事件的元素 其中的子元素也响应 mouseUp 事件 全部通过 jQuery 当用户鼠标单击发生子级的 mouseUp 事件时 如何才能使子级的父级 mouseUp 事件在 jQuery 中也不会发生 你要ev
  • 如何打印类型向量 > 来屏幕 C++?

    我有一个返回值向量 gt 的方法 但我不知道如何打印该向量的内容 我试图循环浏览内容 但出现编译器错误 这是我尝试过的一个例子 vector
  • SwiftUI 中根据文本高度自动调整视图高度

    我正在尝试在 SwiftUI 中创建一个视图 其中左侧图像的背景应根据右侧文本的高度垂直缩放 我尝试了很多不同的方法 从GeometryReader to layoutPriority 但我还没有设法让它们中的任何一个工作 当前状态 期望的
  • 向服务器发送 http 请求而不期待响应

    我需要向服务器发送 POST http 请求 但它不应该期待响应 我应该使用什么方法呢 我一直在使用 WebRequest request2 WebRequest Create http local ape project org 6969
  • 如何显示事务隔离级别(MySQL)

    我想知道当前Mysql数据库设置的隔离级别是什么 怎么才能查出来呢 我尝试在谷歌上搜索但没有找到 检查会话事务级别 mysql8 SELECT transaction ISOLATION 检查全局事务级别 mysql8 SELECT glo
  • IO 绑定操作的并行执行

    我已从头到尾阅读了 TPL 和任务库文档 但是 我仍然无法非常清楚地理解以下案例 现在我需要实现它 我将简化我的情况 我有一个IEnumerable
  • Java - 为什么将数组声明为接口类型?

    这是马克 韦斯教授在他的书中说的Java数据结构与算法分析 public class BinaryHeap
  • 如何使用pymssql获取sql打印消息

    我正在运行一些查询 从其执行中打印运行时统计信息 这是通过完成的print message 在sql脚本中使用 我希望在通过 pymssql 调用过程 脚本时看到这些消息 conn pymssql connect server user p
  • Django 中大表的内存效率(恒定)和速度优化迭代

    我有一张非常大的桌子 它当前位于 MySQL 数据库中 我用的是Django 我需要迭代each表的元素来预先计算一些特定的数据 也许如果我更好的话我可以这样做 但这不是重点 我希望在不断使用内存的情况下尽可能快地保持迭代 因为它已经明确地
  • 如何使用 PHP 获取午夜之前的小时数

    设想 一条记录已输入数据库 我试图找出以下方程 如何获取自添加记录以来的小时数 如何获取自记录以来到午夜还剩多少小时 加入 鉴于这些时间 日期 时间 2012 08 22 20 11 20 时间戳 1345684280 今晚午夜 2012
  • 如何允许用户更改列表框顺序

    我正在寻求帮助 我有两个列表 它们都将数据添加到同一个列表框中 并将它们显示为摘要 我想知道如何让用户在列表框中向上或向下移动索引 项目已添加到此处 private void BtnAddpickup Click object sender
  • 如何将时区全名翻译为 tz 缩写?

    在 Rails 3 x 应用程序中 我需要显示时区缩写 EST PST CST 等 而不是完整的时区名称 我见过许多似乎解决这个问题的讨论 但方式过于冗长 是否有一个 gem 或一个非常简洁的方法来处理这个问题 可以用来正确地映射它们 对于
  • Django 模板 datetime.weekday 名称

    有没有办法将模板中日期时间对象的工作日显示为工作日的实际名称 基本上我想要它打印Friday代替5 请参阅文档内置date filter https docs djangoproject com en dev ref templates b
  • SwiftUI 验证文本字段中的输入

    我试图通过使用正则表达式删除某些字符来验证文本字段中的用户输入 不幸的是 我遇到了 didSet 方法的问题textvar 递归调用自身 import SwiftUI import Combine class TextValidator O
  • 创建对对象的引用

    QuestionR 是否包含对象引用的概念 在Python中 等于运算符实际上是通过引用进行复制 例如 gt gt a 1 2 3 gt gt b a gt gt b 1 10 gt gt a 1 10 3 或在 C 中 vector a
  • 如果 R 中满足条件,则将多列中的值替换为 NA

    如果满足条件 我尝试将多个列中的值替换为 NA 这是一个示例数据集 library tidyverse sample lt tibble id 1 6 team score 5 10 cent dept test agg c 1 2 3 4
  • 如何更改 Jest 中模拟模块中函数的模拟实现

    我有一个看起来像这样的 utils 文件 utils js const getNextDate startDate gt moment startDate MMM Do YYYY startOf day add 10 days format