Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Jest 'spyOn‘TypeScript类而不覆盖其属性和函数

Jest 'spyOn‘TypeScript类而不覆盖其属性和函数
EN

Stack Overflow用户
提问于 2020-11-30 00:29:56
回答 1查看 614关注 0票数 0

有谁知道我如何在不覆盖所有内容的情况下spyOn整个类(构造函数和所有方法) (Jest 26.6.3)?

目前,我正在尝试SpyOn (不是模拟)我的运行时,我只想检查它是否被敏捷正确地实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {
  Agile,
  Runtime,
} from "../../src";
jest.mock("../../src");

// ..

const RuntimeMock = Runtime as jest.MockedClass<typeof Runtime>;

// ..

const agile = new Agile();
expect(RuntimeMock).toHaveBeenCalledWith(/* ... */)

// ..

但是Runtime的所有属性函数都被Jest覆盖,因此它根本不被实例化。

是否有一种方法可以获得类似于spyOn方法的行为,但是有一个完整的类,因为我只想检查运行时的构造函数是否在Agileexpect(RuntimeMock).toHaveBeenCalledWith(/* ... */)中被正确调用

也许这是我的导入逻辑中的一个问题,因为我从一个模块internal.ts导入所有类,正因为如此,Jest可能无法正确地重新创建这些类,但我不知道(https://github.com/agile-ts/agile/blob/tests/rewrite-tests/packages/core/src/internal.ts)。

EN

回答 1

Stack Overflow用户

发布于 2022-11-30 17:21:45

这是我的解决办法。最后,我创建了这个代码片段,它可以spyOn整个类,包括它的构造函数。而且使用方法也很简单,您可以将这个片段添加到文件中,并在需要时导入它。

这是代码(类型记录/ES6):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * spyOn references to classes. Use it with spyOnClass
 */
export const classSpy: any = {};

/**
 * Utility to Spy On all class methods. Not including the constructor
 * @returns a spyOn references to all the class methods
 * includes the methods mockClear and mockReset as convenience
 * to trigger the respective method for all the spies
 */
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export function spyOnClassMethods(proto: any): any {
    const properties = Object.getOwnPropertyNames(proto);
    const spyHolder: any = {};
    for (const i in properties) { spyHolder[properties[i]] = jest.spyOn(proto, properties[i]); }
    spyHolder.mockClear = (): void => { for (const i in properties) { spyHolder[properties[i]].mockClear(); } };
    spyHolder.mockReset = (): void => { for (const i in properties) { spyHolder[properties[i]].mockReset(); } };
    return spyHolder;
}
// To attend jest.mock problems, the should start with 'mock'
const mocksSpyOnClassMethods = spyOnClassMethods;

/**
 * Utility to Spy On all class methods and its constructor.
 */
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export function spyOnClass(mockModuleName: string, mockClassName: string): any {
    classSpy[mockClassName] = {};
    jest.mock(mockModuleName, () => {
        const module = jest.requireActual(mockModuleName) as any;
        const mock = {};
        classSpy[mockClassName] = mocksSpyOnClassMethods(module[mockClassName].prototype);
        mock[mockClassName] = jest.fn().mockImplementation(
            (...args: any[]) => {
                const instance = new module[mockClassName](...args);
                classSpy[mockClassName].constructor = mock[mockClassName];
                return instance;
            }
        );
        return { ...module, ...mock };
    });
}

用法示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { classSpy, spyOnClass } from './mock-utils';

// This must come before other imports that use ClassName.
spyOnClass('module-name', 'ClassName');

import { ClassName } from 'module-name';

test('this', () => {
    doSomethingThatUsesClassName();
    expect(classSpy.ClassName.constructor).toHaveBeenCalled();
    expect(classSpy.ClassName.someMethod).toHaveBeenCalled();
});

希望它能帮助你和其他人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65070187

复制
相关文章
B+树索引使用(7)匹配列前缀,匹配值范围(十九)
上篇文章索引的代价,b+树占的空间比较大,增删改对b+树每个节点的索引排序影响也很大,时间耗费长,所以没有必要不要乱建索引,还介绍了索引的最左原则和全值查询。
用户9919783
2022/07/26
9990
基因注释:区间范围匹配
今天,有老师问我一个问题,如果从一个区间匹配到另一个的区间范围,并找出来。我觉得比较有代表性,就写篇博客总结一下。
邓飞
2022/12/13
7020
基因注释:区间范围匹配
正则表达式范围匹配
近期小编在进行评测语料的制作时,涉及到一些复杂字符串的过滤和提取等内容,例如找出某一句话中在某个特定语句结构下出现的文字,虽然使用循环,if-else等语句可以搞定,但是比较麻烦,使用正则表达式处理就比较方便。
用户5521279
2020/03/19
3.2K0
时间范围内查找
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/10/28
6200
mysql 根据时间范围查询
如果传入的格式是YYYY-MM-DD 的 没有带时分秒,按照上面两种写法会差不全。
全栈程序员站长
2022/09/13
4.8K0
Postgresql模糊匹配案例(包括中文前后模糊)
test 04 使用对应的pattern ops走索引在zh_CN也是列时也走索引
mingjie
2022/05/12
2.4K0
elui实现时间范围筛选
效果图 [2022-03-08_070538.png] 实现步骤 el-date-picker页面使用 <el-form-item label="报修时间"> <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="timestamp" type="daterange"
用户6493868
2022/03/08
9010
时间范围占比工具类
/** * 时间范围占比 * * @param st 开始时间戳 * @param et 结束时间戳 * @param cst 对比开始时间戳 * @param cet 对比结束时间戳 * @return 占比 * @author liushouyun */ public static Tuple2<Integer, Double> proportionOfTimeRange(long st, lon
房上的猫
2020/02/20
6310
时间控件(选择时间范围的插件)「建议收藏」
后台开发,一般都是有筛选条件的查询,那么问题就来了,根据日期范围搜索的情况下,插件要怎么选????
全栈程序员站长
2022/08/25
5.4K0
时间控件(选择时间范围的插件)「建议收藏」
python 计算周的范围时间
week_len = ["", 2, 3, 4] week_time_list = ["2021-09-06", "2021-09-27"] ne = [] print(week_time_list) for j in range(0, len(week_len)): c = ne[-1] if len(ne) > 0 else week_time_list[0] end_date = datetime.strptime(c, '%Y-%m-%d') now_date_end =
Wyc
2021/09/23
1.6K0
python 计算周的范围时间
element-ui 日期时间选择框picker-options如何禁用时间范围( 多个时间范围判断 )
1. element-ui 算是我们在开发中用到最多的pc端 ui框架,今天公司正好有一个需要用到 date-picker 的日期插件
小蔚
2023/07/10
8520
element-ui  日期时间选择框picker-options如何禁用时间范围( 多个时间范围判断 )
GWAS分析后的基因注释:区间范围匹配
图1是SNP的上下游区间,图2是基因的上下游区间,想以图1为标准,将区间内有基因的行放到右边。
邓飞
2023/09/06
9580
GWAS分析后的基因注释:区间范围匹配
linux shell grep 匹配多个字符 和向下匹配多行范围 用法
cat 1.txt | grep -v -E "ok=2|changed|TASK" # grep -v 不匹配, # -E 匹配多个 用管道隔开 | cat 1.txt | grep -A 3 "date" # grep -A 3 在匹配字符date 往下3三行的所有数据 -A是显示匹配后和它后面的n行。 -B是显示匹配行和它前面的n行。 -C是匹配行和它前后各n行。
eisc
2021/06/21
5.4K0
bootstrap-datepicker限定可选时间范围
实际应用中可能会根据日期字段查询某个日期范围内的数据,则需要对日期选择器可选时间进行限制,
全栈程序员站长
2022/09/10
1.8K0
bootstrap-datepicker限定可选时间范围
最后更新修改时间提示【可配置时间范围】
原文:https://laolion.com/archives/2547.html 今天在老狮的博客里到一个类似的博文,于是在本站也弄了一个,但样式并不符合我的审美,所以参照了一下Joe6.1版的时间提示样式改了改。
用户7162790
2022/03/23
6170
判断当前时间是否在某个时间范围内
判断当前时间是否在某个时间范围内 各种活动在接口判单当时间是否在【活动】范围内——小时-分钟 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CutTime { /** * 判断是否满足时间内 * @param CutTime限制时间 * @return */ public static boolean cutTime(String
红目香薰
2022/11/28
1.7K0
PHP 获取 特定时间范围 类
目录 前序   用途   功能及事项   使用方法   代码及注释 前序:   总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,我也不会学
林冠宏-指尖下的幽灵
2018/01/03
2.2K0
sequlize 查询时间范围和多表查询
前端传参时间范围 如:createdAtFrom = '', createdAtTo = '' ,并且在后端接收参数后给的默认值 ''
用户4793865
2023/01/12
2.6K0
Mysql时间范围查询不走索引问题
此时,虽然在create_time字段上添加了索引,但是否会走索引还需要看数据量的情况。
程序新视界
2022/05/06
4.7K0
oracle对时间范围比较的语句
一般在数据库语句中直接写某个时间条件例如:c_datetime<= ‘2014-08-06’或者between time1 and time2是会出错
粲然忧生
2022/09/28
1.1K0

相似问题

Django中的syncdb和更新数据库模式

10

django syncdb和更新的模型

70

更新到1.4后Django syncdb异常

116

django fabric syncdb

10

django中syncdb的问题

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文