Как проверить, вызывалась ли функция с определенными параметрами (toHaveBeenCalledWith) с помощью Jest

Я хочу проверить, была ли вызвана конкретная функция в моем тесте и с правильными параметрами. Из шутливой документации я не могу понять, как это правильно сделать.

предположим, у меня есть что-то вроде этого:

// add.js

function child(ch) {
   const t = ch + 1;
   // no return value here. Function has some other "side effect"
}


function main(a) {
  if (a == 2) {
    child(a + 2);
  }

  return a + 1;
}

exports.main = main;
exports.child = child;

теперь в модульном тесте:

1. Я хочу бежать main(1) и проверьте, что он вернулся 2 и child() не называлась.

2. И тогда я хочу бежать main(2) и то, что он вернулся 3 и child(4) был вызван ровно один раз.

у меня сейчас что-то вроде этого:

// add-spec.js
module = require('./add');

describe('main', () => {

  it('should add one and not call child Fn', () => {
    expect(module.main(1)).toBe(2);
    // TODO: child() was not called
  });

  it('should add one andcall child Fn', () => {

    expect(module.main(2)).toBe(3);
    // TODO: child() was called with param 4 exactly once
    // expect(module.child).toHaveBeenCalledWith(4);
  });

});

Я тестирую это в https://repl.it/languages/jest, поэтому рабочий пример в этом REPL будет высоко оценен.

1 ответов


хорошо, я понял. Фокус в том, чтобы разделить функции на отдельные файлы. Таким образом, код (и работает в https://repl.it/languages/jest ):

// add.js
child = require('./child').child;

function main(a) {
  if (a == 2) {
    child(a + 2);
  }

  return a + 1;
}

exports.main = main;

извлечен ребенок.файл js:

// child.js

function child(ch) {
   const t = ch + 1;
   // no return value here. Function has some other "side effect"
}

exports.child = child;

главная тестовый файл:

// add-spec.js
main = require('./add').main;
child = require('./child').child;

child = jest.fn();

describe('main', () => {

  it('should add one and not call child Fn', () => {
    expect(main(1)).toBe(2);

    expect(child).toHaveBeenCalledTimes(0);
  });

  it('should add one andcall child Fn', () => {
    expect(main(2)).toBe(3);

    expect(child).toHaveBeenCalledWith(4);
    expect(child).toHaveBeenCalledTimes(1);
  });

});