我有一个函数,我想在TypeScript中模拟该函数以进行测试。在我的测试中,我只关心json
和status
。但是,当使用Jest的jest.spyOn
时,我的模拟函数的类型设置为返回http Response
类型。这很尴尬,因为这意味着我必须手动去实现一堆无关紧要的函数和属性。
我怀疑这里有某种方法可以使用部分类型,以便通过将返回类型重写为我只关心的内容来更好,更有用的模拟。我将如何去做?
export function mockApi(json: object, status: number): void {
jest.spyOn(
myApiModule,
'methodWhichReturnsAResponse'
).mockImplementation(() =>
Promise.resolve({
json: () => Promise.resolve(json),
status,
// Below here is to appease jest types (not needed for
// testing purposes at the time of writing)
headers: {
has: (name: string) => true,
// get, set, etc...
},
ok: true,
redirected: false,
// and about 10 other properties which exist on the Response type
// ...
}),
);
}
答案 0 :(得分:1)
可以使用as
...
export function mockApi(json: object, status: number): void {
jest.spyOn(
myApiModule,
'methodWhichReturnsAResponse'
).mockImplementation(() =>
Promise.resolve({
json: () => Promise.resolve(json),
status
} as http.Response), // <-- here
);
}
用于类型转换的as
关键字用于将文字转换为X类型时,将仅允许您部分定义它,但是您仍需进行类型检查,因为您无法定义不支持的道具存在。
示例:
type X {
a: number
b: number
}
const x = { a: 2 } as X // OK
const y = { a: 3, c: 2 } as X // NOT OK, because c does not exist in X
答案 1 :(得分:0)
我找到了一种使用unknown
类型的解决方案。
尝试并无法立即使用as
进行类型转换后,我首先将诺言投射到unknown
,然后将此值转换为所需的Response
类型,如下所示:
// ...
.mockImplementation(() => {
const httpResponsePromise = Promise.resolve({
json: () => Promise.resolve(json),
status,
}) as unknown;
return httpResponsePromise as Promise<Response>;
});