From 4e996ae5070c9fff7c4f7cce17149e4b23f3ca03 Mon Sep 17 00:00:00 2001 From: Han Feng Date: Mon, 29 May 2023 21:45:27 +0800 Subject: [PATCH] fix: `rejects` & `resolves` breaks with thenable objects (#3456) --- packages/expect/src/utils.ts | 4 ++-- test/core/test/jest-expect.test.ts | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 2ce8dc563c1f..1201f5a90b12 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -1,6 +1,6 @@ -export function recordAsyncExpect(test: any, promise: Promise) { +export function recordAsyncExpect(test: any, promise: Promise | PromiseLike) { // record promise for test, that resolves before test ends - if (test) { + if (test && promise instanceof Promise) { // if promise is explicitly awaited, remove it from the list promise = promise.finally(() => { const index = test.promises.indexOf(promise) diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 543bdcc95bb9..19862611e5d6 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -720,6 +720,25 @@ describe('async expect', () => { expect(value).toBe(1) }) }) + + it('handle thenable objects', async () => { + await expect({ then: (resolve: any) => resolve(0) }).resolves.toBe(0) + await expect({ then: (_: any, reject: any) => reject(0) }).rejects.toBe(0) + + try { + await expect({ then: (resolve: any) => resolve(0) }).rejects.toBe(0) + } + catch (error) { + expect(error).toEqual(new Error('promise resolved "0" instead of rejecting')) + } + + try { + await expect({ then: (_: any, reject: any) => reject(0) }).resolves.toBe(0) + } + catch (error) { + expect(error).toEqual(new Error('promise rejected "0" instead of resolving')) + } + }) }) it('compatible with jest', () => {