Невозможно проверить, называется ли B
способ написания кода.
Подробно
jest.spyOn
заменяет свойство функции объекта нашпион .
jest.spyOn(fn, 'b')
заменит свойство b
объекта fn
на шпиона.
fn.a()
вызывает A
, который напрямую вызывает B
, он не вызывает fn.b
, поэтому шпион никогда не вызывается.
Решение
A
необходимо вызвать B
, используя свойство объекта, которое можно заменить нашпион во время теста .
При создании шпиона объект обычно является модулем .
Именно поэтому шпионить за экспортированными функциями довольно легко и шпионитьс неэкспортированными функциями довольно сложно, что поднимает важный вопрос: если функция вызывает неэкспортированную функцию в том же модуле, то это просто деталь реализации, которая не видна вне модуля и сподход к тестированию черного ящика, его не нужно тестировать.35 *
Если вы обнаружите, что B
- это больше, чем подробности реализации, и вы хотите шпионить или заглушить его функциональность, тогда самый простой подход (особенно для этого кода, где экспорт - это функция, которая создает новый объекткаждый раз, когда он вызывается), необходимо переместить B
в собственный модуль:
actions-beta.js
import { B } from './lib';
export function A () {
B()
}
export function API (){
return {
a: A,
b: B
}
}
lib.js
export function B () {
console.log('B is called')
}
Тест:
import { API } from './actions-beta'
import * as lib from './lib'; // import the module with B
describe('test A', () => {
test('', () => {
const fn = API()
console.log(fn)
const spy = jest.spyOn(lib, 'B') // spy on B using its module
fn.a()
expect(spy).toHaveBeenCalled() // SUCCESS
})
})