test_runner: mock.mockImplementationOnce only works for the last call #47718
Closed
Description
Version
v21.0.0-pre
Platform
Darwin MacBook-Pro-4.local 21.6.0 Darwin Kernel Version 21.6.0: Mon Aug 22 20:19:52 PDT 2022; root:xnu-8020.140.49~2/RELEASE_ARM64_T6000 arm64
Subsystem
No response
What steps will reproduce the bug?
const { describe, it, mock } = require('node:test')
const { strictEqual } = require('node:assert')
describe('my test', () => {
it('hello world', () => {
const instance = { sum: (arg1, arg2) => arg1 + arg2 }
const m = mock.method(
instance,
instance.sum.name
)
m.mock.mockImplementationOnce(() => 1)
m.mock.mockImplementationOnce(() => 2)
strictEqual(instance.sum(1, 1), 1)
strictEqual(instance.sum(5, 1), 2)
strictEqual(instance.sum(2, 1), 3)
})
})
./node --test erick-test/index.test.js
▶ my test
✖ hello world (1.817708ms)
AssertionError: Expected values to be strictly equal:
2 !== 1
at TestContext.<anonymous> (/Users/erickwendel/Downloads/projetos/node/erick-test/index.test.js:14:3)
at Test.runInAsyncScope (node:async_hooks:206:9)
at Test.run (node:internal/test_runner/test:568:25)
at Test.start (node:internal/test_runner/test:481:17)
at node:internal/test_runner/test:799:71
at node:internal/per_context/primordials:482:82
at new Promise (<anonymous>)
at new SafePromise (node:internal/per_context/primordials:450:29)
at node:internal/per_context/primordials:482:9
at Array.map (<anonymous>) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 2,
expected: 1,
operator: 'strictEqual'
}
▶ my test (2.8215ms)
ℹ tests 1
ℹ suites 1
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 75.543917
✖ failing tests:
✖ hello world (1.817708ms)
AssertionError: Expected values to be strictly equal:
2 !== 1
at TestContext.<anonymous> (/Users/erickwendel/Downloads/projetos/node/erick-test/index.test.js:14:3)
at Test.runInAsyncScope (node:async_hooks:206:9)
at Test.run (node:internal/test_runner/test:568:25)
at Test.start (node:internal/test_runner/test:481:17)
at node:internal/test_runner/test:799:71
at node:internal/per_context/primordials:482:82
at new Promise (<anonymous>)
at new SafePromise (node:internal/per_context/primordials:450:29)
at node:internal/per_context/primordials:482:9
at Array.map (<anonymous>) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 2,
expected: 1,
operator: 'strictEqual'
}
How often does it reproduce? Is there a required condition?
Always
What is the expected behavior? Why is that the expected behavior?
mock.mockImplementationOnce should be used to mock each individual call.
given
mock.mockImplementationOnce(() => 1)
mock.mockImplementationOnce(() => 2)
mock.mockImplementationOnce(() => 3)
Each call result should be returned given the order configured by the mockImplementation Once
What do you see instead?
Only the last mock.mockImplementationOnce is applied.
Additional information
I'd also enable sequence calls like:
mock
.mockImplementationOnce(() => 1)
.mockImplementationOnce(() => 2)
.mockImplementationOnce(() => 3)
@nodejs/test_runner