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', () => {