Как шпионить за внутренней функцией из того же файла с помощью Jest

#javascript #jestjs

Вопрос:

У меня есть файл со следующими функциями:

 // functions.js

function bar() {
  return 'bar';
}

function foo() {
  return bar();
}

export functions = {
  bar,
  foo,
};
 

И я хочу протестировать foo функцию следующим образом:

 // functions.test.js

import {functions} from './functions.js';

describe('test foo', () => {
  it('should call bar', () => {
    const spy = jest.spyOn(functions, 'bar');

    functions.foo();

    expect(spy).toHaveBeenCalled();
  });
});
 

И я получаю следующую ошибку:

 Expected number of calls: >= 1
Received number of calls:    0

expect(spy).toHaveBeenCalled();
            ^
 

Есть идеи, что не так с этим тестом?

Комментарии:

1. Если вы используете экспорт ESM, попробуйте экспортировать функцию напрямую, а не в объект?

2. Не. expect(functions.foo()).toBe('bar') . Тестовое поведение , а не реализация.

3. @jonrsharpe звучит неплохо.

Ответ №1:

Вы шпионите не за той функцией. functions.bar это не то же bar самое, что вызывается внутри foo функции. foo является ссылкой bar , которая является автономной функцией, однако вы шпионите за функцией, прикрепленной к functions объекту.

Если вы измените свой код таким образом, он будет работать.

 export functions = {
  bar(){},
  foo(){this.bar()},
};
 

Комментарии:

1. вы изменяете всю структуру экспортируемой функции. плохое решение.

2. Ну, ваш код не структурирован должным образом, чтобы делать то, что вы хотите. Читайте о понимании контекста в литералах объектов Javascript