#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