gpt4 book ai didi

typescript - 为什么 jest v24 模拟类需要私有(private)方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:30 28 4
gpt4 key购买 nike

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

如何为每个测试创建模拟?

更多信息:

我开始了一个新项目,现在正在使用 jest v24,这在编写测试时产生了一个我无法解决的问题。

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

const Mock = jest.fn<Randomiser>(() => ({
getRandom: jest.fn().mockReturnValue(10)
}));

这将成功编译和构建。

从 v24 开始,fn 函数采用和添加泛型 <T, Y extends any[]>我不知道这是否与行为改变有关,但现在我收到一个错误:

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

import "jest";

class Randomiser {
public getRandom(): number {
return this.rand();
}
private rand(): number {
return Math.random();
}
}

class Multiplier {
private randomiser: Randomiser;
constructor(randomiser: Randomiser) {
this.randomiser = randomiser;
}

multiplyRandom(factor: number): number {
return Math.floor(this.randomiser.getRandom() * factor);
}
}

describe("tests", () => {
it("10 x 2 = 20", () => {
const Mock = jest.fn<Randomiser, any>(() => ({
getRandom: jest.fn().mockReturnValue(10),
rand: jest.fn() //with this line I get an error because it should be private, without this line I get the error above.
}));
expect(new Multiplier(new Mock()).multiplyRandom(2)).toBe(20);
})
})

我希望能够像使用 v23 一样编写模拟,即我可以模拟类并且只需要模拟我要调用的函数。

现在我必须模拟所有函数,包括私有(private)函数和私有(private)属性,然后它会提示这些函数不是私有(private)的。

最佳答案

两种解决方案:

<强>1。使用 Partial<Type> ,这将允许您部分模拟您的类(class):

const Mock = jest.fn<Partial<Randomiser>, []>(() => ({
getRandom: jest.fn().mockReturnValue(10)
}));

然后将您的 mock 转换为您的类类型以注入(inject)它,例如:

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

<强>2。不要为模拟指定任何类型。

另一种方法是不指定模拟的类型,这使得模拟类型为 any .

const Mock = jest.fn(() => ({
getRandom: jest.fn().mockReturnValue(10)
}));

然后你可以直接注入(inject)你的mock,当然,在这种情况下它不会被键入。

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

关于typescript - 为什么 jest v24 模拟类需要私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54680300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com