From 269912f08903ba9543968c7cbcecce2c1f9c974e Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 6 Oct 2020 10:45:21 +0200 Subject: [PATCH] Fix type definitions for promises When calling `mockResolvedValue` (-`Once`), the argument should be the expected return value unwrapped from its Promise. Likewise, when mocking a rejected value, the passed argument needs not necessarily be of the same type as the expected successful return value. --- CHANGELOG.md | 2 ++ packages/jest-mock/src/index.ts | 22 ++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f29887d759a1..786ec76af00a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Fixes +- `[jest-mock]` Fix typings for `mockResolvedValue`, `mockResolvedValueOnce`, `mockRejectedValue` and `mockRejectedValueOnce` + ### Chore & Maintenance ### Performance diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index 8031900b0453..073c9d6b8a6d 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -63,13 +63,15 @@ namespace JestMock { mockReturnThis(): this; mockReturnValue(value: T): this; mockReturnValueOnce(value: T): this; - mockResolvedValue(value: T): this; - mockResolvedValueOnce(value: T): this; - mockRejectedValue(value: T): this; - mockRejectedValueOnce(value: T): this; + mockResolvedValue(value: Unpromisify): this; + mockResolvedValueOnce(value: Unpromisify): this; + mockRejectedValue(value: unknown): this; + mockRejectedValueOnce(value: unknown): this; } } +type Unpromisify = T extends Promise ? R : never; + /** * Possible types of a MockFunctionResult. * 'return': The call completed by returning normally. @@ -661,20 +663,20 @@ class ModuleMockerClass { // next function call will return this value or default return value f.mockImplementationOnce(() => value); - f.mockResolvedValueOnce = (value: T) => - f.mockImplementationOnce(() => Promise.resolve(value)); + f.mockResolvedValueOnce = (value: Unpromisify) => + f.mockImplementationOnce(() => Promise.resolve(value as T)); - f.mockRejectedValueOnce = (value: T) => + f.mockRejectedValueOnce = (value: unknown) => f.mockImplementationOnce(() => Promise.reject(value)); f.mockReturnValue = (value: T) => // next function call will return specified return value or this one f.mockImplementation(() => value); - f.mockResolvedValue = (value: T) => - f.mockImplementation(() => Promise.resolve(value)); + f.mockResolvedValue = (value: Unpromisify) => + f.mockImplementation(() => Promise.resolve(value as T)); - f.mockRejectedValue = (value: T) => + f.mockRejectedValue = (value: unknown) => f.mockImplementation(() => Promise.reject(value)); f.mockImplementationOnce = (