diff --git a/packages/vitest/src/runtime/mocker.ts b/packages/vitest/src/runtime/mocker.ts index 105c5c145a06..b3543c731719 100644 --- a/packages/vitest/src/runtime/mocker.ts +++ b/packages/vitest/src/runtime/mocker.ts @@ -328,7 +328,7 @@ export class VitestMocker { const spyModule = this.spyModule if (!spyModule) throw this.createError('[vitest] `spyModule` is not defined. This is Vitest error. Please open a new issue with reproduction.') - const mock = spyModule.spyOn(newContainer, property).mockImplementation(function (this: any, ...args: any[]) { + const mock = spyModule.spyOn(newContainer, property).mockImplementation(function (this: any) { // jest reference // https://github.com/jestjs/jest/blob/2c3d2409879952157433de215ae0eee5188a4384/packages/jest-mock/src/index.ts#L678-L691 @@ -339,9 +339,9 @@ export class VitestMocker { for (const key in this) { if (typeof this[key] === 'function') { // TODO: ability to restore? - // mock but delegate to original prototype method, which should be also mocked already + // mock by delegating calls to original prototype method, which should be also mocked already const original = this[key] - spyModule.spyOn(this, key).mockImplementation(() => original.apply(this, args)) + const _mockInner = spyModule.spyOn(this, key).mockImplementation((...args: any[]) => original.apply(this, args)) } } } diff --git a/test/core/src/mockedE.ts b/test/core/src/mockedE.ts index dcdeb479f319..607a90bdc1b3 100644 --- a/test/core/src/mockedE.ts +++ b/test/core/src/mockedE.ts @@ -1,5 +1,5 @@ export class MockedE { - public doSomething(arg: string) { + public testFn(arg: string) { return arg.repeat(2) } } diff --git a/test/core/test/mocked-wip.test.ts b/test/core/test/mocked-wip.test.ts index 4e9327bd3b40..ba7ceef7803a 100644 --- a/test/core/test/mocked-wip.test.ts +++ b/test/core/test/mocked-wip.test.ts @@ -12,23 +12,83 @@ test('mock each instance method separately', () => { const instance1 = new MockedE() const instance2 = new MockedE() expect(instance1).not.toBe(instance2) - expect(instance1.doSomething).not.toBe(instance2.doSomething) - expect(instance1.doSomething).not.toBe(MockedE.prototype.doSomething) - expect(vi.mocked(instance1.doSomething).mock).not.toBe(vi.mocked(instance2.doSomething).mock) - - // TODO: check input/output - instance1.doSomething('a') - expect(instance1.doSomething).toBeCalledTimes(1) - expect(instance2.doSomething).toBeCalledTimes(0) - expect(MockedE.prototype.doSomething).toBeCalledTimes(1) - - instance2.doSomething('b') - expect(instance1.doSomething).toBeCalledTimes(1) - expect(instance2.doSomething).toBeCalledTimes(1) - expect(MockedE.prototype.doSomething).toBeCalledTimes(2) - - instance1.doSomething('c') - expect(instance1.doSomething).toBeCalledTimes(2) - expect(instance2.doSomething).toBeCalledTimes(1) - expect(MockedE.prototype.doSomething).toBeCalledTimes(3) + expect(instance1.testFn).not.toBe(instance2.testFn) + expect(instance1.testFn).not.toBe(MockedE.prototype.testFn) + expect(vi.mocked(instance1.testFn).mock).not.toBe(vi.mocked(instance2.testFn).mock) + + instance1.testFn('a') + expect(instance1.testFn).toBeCalledTimes(1) + expect(instance2.testFn).toBeCalledTimes(0) + expect(MockedE.prototype.testFn).toBeCalledTimes(1) + expect(vi.mocked(instance1.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "a", + ], + ] + `) + expect(vi.mocked(MockedE.prototype.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "a", + ], + ] + `) + + instance2.testFn('b') + expect(instance1.testFn).toBeCalledTimes(1) + expect(instance2.testFn).toBeCalledTimes(1) + expect(MockedE.prototype.testFn).toBeCalledTimes(2) + expect(vi.mocked(instance2.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "b", + ], + ] + `) + expect(vi.mocked(MockedE.prototype.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "a", + ], + [ + "b", + ], + ] + `) + + instance1.testFn('c') + expect(instance1.testFn).toBeCalledTimes(2) + expect(instance2.testFn).toBeCalledTimes(1) + expect(MockedE.prototype.testFn).toBeCalledTimes(3) + expect(vi.mocked(instance1.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "a", + ], + [ + "c", + ], + ] + `) + expect(vi.mocked(instance2.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "b", + ], + ] + `) + expect(vi.mocked(MockedE.prototype.testFn).mock.calls).toMatchInlineSnapshot(` + [ + [ + "a", + ], + [ + "b", + ], + [ + "c", + ], + ] + `) })