Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 为什么jest v24模拟类需要私有方法_Typescript_Visual Studio Code_Jestjs - Fatal编程技术网

Typescript 为什么jest v24模拟类需要私有方法

Typescript 为什么jest v24模拟类需要私有方法,typescript,visual-studio-code,jestjs,Typescript,Visual Studio Code,Jestjs,我需要使用jest v24+创建typescript类的模拟实现。我特别尝试创建一个模拟类,该类被注入构造函数,并模拟将被调用以返回特定响应的函数 如何为每个测试创建模拟 更多信息: 我已经开始了一个新项目,现在正在使用JESTV24,它在编写测试时产生了一个我无法解决的问题 使用下面的jest v23示例,之前我可以如下模拟Randomiser类: const Mock = jest.fn<Randomiser>(() => ({ getRandom: jest.fn()

我需要使用jest v24+创建typescript类的模拟实现。我特别尝试创建一个模拟类,该类被注入构造函数,并模拟将被调用以返回特定响应的函数

如何为每个测试创建模拟

更多信息:

我已经开始了一个新项目,现在正在使用JESTV24,它在编写测试时产生了一个我无法解决的问题

使用下面的jest v23示例,之前我可以如下模拟Randomiser类:

const Mock = jest.fn<Randomiser>(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));
const Mock=jest.fn(()=>({
getRandom:jest.fn().mockReturnValue(10)
}));
它将成功编译和构建

从v24开始,fn函数将进行常规添加
,我不知道这是否与行为的改变有关,但现在我得到一个错误:

属性“rand”在类型“{getRandom:Mock;}”中丢失,但在类型“Randomiser.ts(2741)中是必需的

导入“jest”;
类随机化器{
public getRandom():数字{
返回这个.rand();
}
private rand():编号{
返回Math.random();
}
}
类乘数{
专用随机化器:随机化器;
构造函数(randomiser:randomiser){
this.randomiser=randomiser;
}
多重随机数(因子:数字):数字{
返回Math.floor(this.randomiser.getRandom()*因子);
}
}
描述(“测试”,()=>{
它(“10 x 2=20”,()=>{
const Mock=jest.fn(()=>({
getRandom:jest.fn().mockReturnValue(10),
rand:jest.fn()//这一行我得到一个错误,因为它应该是私有的,没有这一行我得到上面的错误。
}));
expect(新乘数(新Mock()).multiplyRandom(2)).toBe(20);
})
})
我希望能够以与v23相同的方式编写模拟,也就是说,我可以模拟类,只需要模拟我要调用的函数

现在我必须模拟所有函数,包括私有函数和私有属性,然后它抱怨这些函数不是私有的。

两种解决方案:

1。使用
Partial
,这将允许您部分模拟您的类:

const Mock = jest.fn<Partial<Randomiser>, []>(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));
2。不要为模拟指定任何类型。

另一种方法是不指定mock的类型,这会使mock类型
any

const Mock = jest.fn(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));
然后可以直接按原样注入mock,但当然,在本例中不会键入它

const mock = new Mock();
expect(new Multiplier(mock).multiplyRandom(2)).toBe(20);

谢谢你,自从《笑话24》以来,我不能部分地模仿一门课,我也不知道部分的内容,谢谢你!
const Mock = jest.fn(() => ({
  getRandom: jest.fn().mockReturnValue(10)
}));
const mock = new Mock();
expect(new Multiplier(mock).multiplyRandom(2)).toBe(20);