Issue
I have a function which I would like to mock for testing purposes in TypeScript. In my tests, all I care about are the json
and the status
. However, when using Jest's jest.spyOn
the type of my mocked function is set to return a http Response
type. This is awkward as it means I have to manually go and implement a bunch of functions and properties that are irrelevant and arbitrary.
I suspect there is some way to use a partial type here to allow better and more useful mocking by overriding the return type to only that I care about. How would I go about doing this?
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
// ...
}),
);
}
Solution
I found a solution using the unknown
type.
After trying and failing to use as
to typecast immediately, I first cast the promise to unknown
and then cast this value to the desired Response
type like so:
// ...
.mockImplementation(() => {
const httpResponsePromise = Promise.resolve({
json: () => Promise.resolve(json),
status,
}) as unknown;
return httpResponsePromise as Promise<Response>;
});
Answered By - James Mulholland
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.