APW*_*APW 5 typescript jestjs visual-studio-code
我需要使用 jest v24+ 创建打字稿类的模拟实现。我特别尝试创建一个模拟类,该类被注入到构造函数中,并模拟将被调用以返回特定响应的函数。
如何为每个测试创建模拟?
更多信息:
我已经开始了一个新项目,现在使用 jest v24,它在编写测试时产生了一个我无法解决的问题。
将下面的示例与 jest v23 一起使用,以前我可以模拟 Randomiser 类,如下所示:
const Mock = jest.fn<Randomiser>(() => ({
getRandom: jest.fn().mockReturnValue(10)
}));
Run Code Online (Sandbox Code Playgroud)
这将成功编译和构建。
从 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);
})
})
Run Code Online (Sandbox Code Playgroud)
我期望能够以与 v23 相同的方式编写模拟,即我可以模拟该类,并且只需要模拟我要调用的函数。
现在我必须模拟所有函数,包括私有函数和私有属性,然后它抱怨它们不是私有的。
两种解决方案:
1. 使用Partial<Type>,这将允许你部分模拟你的类:
const Mock = jest.fn<Partial<Randomiser>, []>(() => ({
getRandom: jest.fn().mockReturnValue(10)
}));
Run Code Online (Sandbox Code Playgroud)
然后将您的模拟转换为您的类类型以注入它,例如:
const mock: Randomiser = new Mock() as Randomiser;
expect(new Multiplier(mock).multiplyRandom(2)).toBe(20);
Run Code Online (Sandbox Code Playgroud)
2. 不要为mock指定任何类型。
另一种方法是不指定模拟的类型,这使得模拟类型为any.
const Mock = jest.fn(() => ({
getRandom: jest.fn().mockReturnValue(10)
}));
Run Code Online (Sandbox Code Playgroud)
然后你可以直接注入你的模拟,但当然,在这种情况下它不会被输入。
const mock = new Mock();
expect(new Multiplier(mock).multiplyRandom(2)).toBe(20);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1086 次 |
| 最近记录: |