test_runner: fix mock.method to support class instances
It fixes a problem when trying to spy a method from a class instance or static functions on a class instance.
Working example:
import { mock } from 'node:test'
class Runner {
static async someTask(msg) {
return Promise.resolve(msg);
}
static async method(msg) {
await this.someTask(msg);
return msg;
}
}
mock.method(Runner, Runner.someTask.name);
await Runner.method('ok')
console.log('calls', {
length: Runner.someTask.mock.calls.length,
result: await Runner.someTask.mock.calls[0].result,
arguments: Runner.someTask.mock.calls[0].arguments
});
// calls { length: 1, result: 'ok', arguments: [ 'ok' ] }
and
import { mock } from 'node:test'
class Runner {
async someTask(msg) {
return Promise.resolve(msg);
}
async method(msg) {
await this.someTask(msg);
return msg;
}
}
const runner = new Runner()
mock.method(runner, runner.someTask.name);
await runner.method('ok')
console.log('calls', {
length: runner.someTask.mock.calls.length,
result: await runner.someTask.mock.calls[0].result,
arguments: runner.someTask.mock.calls[0].arguments
});
// calls { length: 1, result: 'ok', arguments: [ 'ok' ] }
This also makes sure that null Objects and inexisting methods are verified