From eda022f0f31c99465d13713abf60ba825a32a463 Mon Sep 17 00:00:00 2001 From: Simon Abbott Date: Thu, 18 Aug 2022 12:23:52 -0500 Subject: [PATCH] fix: allow referring to first seen value while automocking The ref ids start at 0. This was a problem because doing `if (refId)` would behave incorrectly if `refId === 0`, which is a valid state. --- packages/vitest/src/runtime/mocker.ts | 2 +- test/core/src/mockedD.ts | 4 ++++ test/core/test/mocked.test.ts | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/core/src/mockedD.ts diff --git a/packages/vitest/src/runtime/mocker.ts b/packages/vitest/src/runtime/mocker.ts index d2105de179c3..1fe74cb6482c 100644 --- a/packages/vitest/src/runtime/mocker.ts +++ b/packages/vitest/src/runtime/mocker.ts @@ -224,7 +224,7 @@ export class VitestMocker { // Special handling of references we've seen before to prevent infinite // recursion in circular objects. const refId = refs.getId(value) - if (refId) { + if (refId !== undefined) { finalizers.push(() => define(newContainer, property, refs.getMockedValue(refId))) continue } diff --git a/test/core/src/mockedD.ts b/test/core/src/mockedD.ts new file mode 100644 index 000000000000..22181e6faf5b --- /dev/null +++ b/test/core/src/mockedD.ts @@ -0,0 +1,4 @@ +import { MockedC } from './mockedC' + +export default MockedC +export * from './mockedC' diff --git a/test/core/test/mocked.test.ts b/test/core/test/mocked.test.ts index 2082109a0c98..13be6b932688 100644 --- a/test/core/test/mocked.test.ts +++ b/test/core/test/mocked.test.ts @@ -5,11 +5,13 @@ import { two } from '../src/submodule' import * as mocked from '../src/mockedA' import { mockedB } from '../src/mockedB' import { MockedC, asyncFunc, exportedStream } from '../src/mockedC' +import MockedDefault, { MockedC as MockedD } from '../src/mockedD' import * as globalMock from '../src/global-mock' vitest.mock('../src/submodule') vitest.mock('virtual-module', () => ({ value: 'mock' })) vitest.mock('../src/mockedC') +vitest.mock('../src/mockedD') test('submodule is mocked to return "two" as 3', () => { assert.equal(3, two) @@ -37,6 +39,7 @@ describe('mocked classes', () => { test('should not delete the prototype', () => { expect(MockedC).toBeTypeOf('function') expect(MockedC.prototype.doSomething).toBeTypeOf('function') + expect(MockedC.prototype.constructor).toBe(MockedC) }) test('should mock the constructor', () => { @@ -57,6 +60,17 @@ describe('mocked classes', () => { }) }) +describe('default exported classes', () => { + test('should preserve equality for re-exports', () => { + expect(MockedDefault).toEqual(MockedD) + }) + + test('should preserve prototype', () => { + expect(MockedDefault.prototype.constructor).toBe(MockedDefault) + expect(MockedD.prototype.constructor).toBe(MockedD) + }) +}) + test('async functions should be mocked', () => { expect(asyncFunc()).toBeUndefined() expect(vi.mocked(asyncFunc).mockResolvedValue).toBeDefined()