Skip to content

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

Merge request reports

Loading