Как проверить абстрактные функции в JavaScript, используя Jest? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть 2 функции A и B javascript, определенные ниже и представленные через другую функцию, называемую API, как показано ниже. Я хочу проверить функцию A, чтобы узнать, вызывает ли она B или нет.

function A () {
  B()
}

function B () {
  console.log('B is called')
}

export function API (){
  return {
    a: A,
    b: B
  }
}

Как я опробовал мои тестовые функции, как показано ниже, которые не работают.

import { API } from './actions-beta'

describe('test A', () => {
  test('', () => {
    const fn = API()
    console.log(fn)
    const spy = jest.spyOn(fn, 'b')
    fn.a()
    expect(spy).toHaveBeenCalled()
  })
})

1 Ответ

0 голосов
/ 26 октября 2018

Невозможно проверить, называется ли 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
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...