function toHaveBeenCalledTimes(matchersUtil) {
      return {
        compare: function (actual, expected) {
          if (!j$.isSpy(actual)) {
            throw new Error(
              getErrorMsg('Expected a spy, but got ' + matchersUtil.pp(actual) + '.'),
            );
          }

          const args = Array.prototype.slice.call(arguments, 0),
            result = { pass: false };

          if (!j$.isNumber_(expected)) {
            throw new Error(
              getErrorMsg(
                'The expected times failed is a required argument and must be a number.',
              ),
            );
          }

          actual = args[0];
          const calls = actual.calls.count();
          const timesMessage = expected === 1 ? 'once' : expected + ' times';
          result.pass = calls === expected;
          result.message = result.pass
            ? 'Expected spy ' +
              actual.and.identity +
              ' not to have been called ' +
              timesMessage +
              '. It was called ' +
              calls +
              ' times.'
            : 'Expected spy ' +
              actual.and.identity +
              ' to have been called ' +
              timesMessage +
              '. It was called ' +
              calls +
              ' times.';
          return result;
        },
      };
    }
{@link expect} the actual (a {@link Spy}) to have been called the specified number of times.
@function
@name matchers#toHaveBeenCalledTimes
@since 2.4.0
@param {Number} expected - The number of invocations to look for.
@example
expect(mySpy).toHaveBeenCalledTimes(3);