typescript - I Jest, hvordan mocker jeg et Promise av void?
Jeg bruker Jest og Typescript. Jeg har en asynkron funksjon som ikke returnerer noe (void). Hvordan kan jeg mocke returverdien til void? Jeg prøvde følgende
const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve(void));
jest.mock('../config', () => ({
setup: async () =>
myMockFn(),
}));
men jeg får kompilasjonsfeilen
Expression expected.
relatert til "Promise.resolve(void)".
Svar #1
void brukt her i value-posisjon er en JavaScript-operator. Det er en en-argument-operator, dvs. den aksepterer et enkelt argument. Derfor feilen.
void som en TypeScript-type bør brukes i type-posisjon for å uttrykke at funksjonens returverdi ikke vil bli observert.
const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve());
Det er nok til å spøke med en funksjon med Promise<void> returtype.
Svar #2
Du kan mocke en funksjon som returnerer Promise<void> med:
jest.fn().mockResolvedValue(undefined)
Hvis du prøver å fange returverdien fra en void-funksjon, får du undefined:
function foo(): void {
console.log('foo called');
}
console.log(foo());
// foo called
// undefined
I tillegg ser Promise<void> ut til å være det samme som Promise<undefined>:
console.log(Promise.resolve());
// Promise { undefined }
console.log(Promise.resolve(undefined));
// Promise { undefined }
undefined er kompatibel med void og kan være den løste verdien:
interface Bar {
foo(): Promise<void>;
}
describe('StackOverflow', () => {
test('mock Promise<void>', async () => {
const mockBar: Bar = {
foo: jest.fn().mockResolvedValueOnce(undefined),
};
await mockBar.foo();
});
});
