Jest насмешливая функция из другого модуля: значения результатов не определены - PullRequest
0 голосов
/ 22 апреля 2020

Я практикую тестирование с Jest, в частности, функции насмешки.

Я тестирую функцию, которая возвращает удвоенный параметр. Я тестирую эту функцию, высмеивая ее и сопоставляя несколько параметров.

вот функция, которую я тестирую, она находится в файле ("./mock-func.js"):

function doubling(n) {
  return n * 2;
}

exports.module = doubling;

вот test (в другом файле):

const mockFunc = require("./mock-func.js");

mockFunc.doubling = jest.fn();

test("map calls functions correctly", () => {
  const a = [10, 20, 30];

  a.map(mockFunc.doubling);

  expect(mockFunc.doubling.mock.calls.length).toBe(3);
  expect(mockFunc.doubling.mock.calls[0]).toEqual([10, 0, a]);
  expect(mockFunc.doubling.mock.calls[1]).toEqual([20, 1, a]);
  expect(mockFunc.doubling.mock.calls[2]).toEqual([30, 2, a]);
  expect(mockFunc.doubling.mock.results[0].value).toBe(20);
  expect(mockFunc.doubling.mock.results[1].value).toBe(40);
  expect(mockFunc.doubling.mock.results[2].value).toBe(60);
});

проблема, которая у меня есть, состоит в том, что тест проходит для ложных вызовов, но не для значений результатов. Это означает, что он возвращает неопределенное значение, когда ожидаемые значения равны 20, 40, 60. Я не могу понять, почему фиктивные вызовы проходят, но не значения результатов.

Я подозреваю, что это потому, что функция находится в другом модуле, потому что тест пройден, если я определю функцию в тесте следующим образом:

const myMockFn = jest.fn(n => n * 2);

test("map calls functions correctly", () => {
  const a = [10, 20, 30];

  a.map(myMockFn);

  expect(myMockFn.mock.calls.length).toBe(3);
  expect(myMockFn.mock.calls[0]).toEqual([10, 0, a]);
  expect(myMockFn.mock.calls[1]).toEqual([20, 1, a]);
  expect(myMockFn.mock.calls[2]).toEqual([30, 2, a]);
  expect(myMockFn.mock.results[0].value).toBe(20);
  expect(myMockFn.mock.results[1].value).toBe(40);
  expect(myMockFn.mock.results[2].value).toBe(60);
});

любая помощь / обратная связь будет принята с благодарностью! спасибо!

1 Ответ

0 голосов
/ 22 апреля 2020

jest.fn() создаст фиктивную функцию, но не вызовет реальную функцию. Вы можете предоставить фиктивную реализацию, как вы это сделали в сценарии, где проходят тесты.

Однако вы не должны насмехаться над модулем, который вы пытаетесь протестировать.

Если вам нужно чтобы проверить поведение вашей функции, лучше всего вызвать саму функцию и подтвердить возвращаемое значение.

const res = doubling(20)
expect(res).toEqual(40)

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

...