Jest: Как проверить функцию, которая вызывает другую функцию в теле - PullRequest
0 голосов
/ 25 февраля 2020

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

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

Буду признателен за любую помощь.

test.ticTacToe. js

describe('TicTacToe Utils', () => {
    const randomMock = jest.spyOn(Utils, 'getRandomNumber')
        .mockReturnValueOnce(0)
        .mockReturnValueOnce(1)

    const board = [
        [['X'], [], []],
        [[], [], []],
        [[], [], []]
        ]

    it('makeRandomComputerMove', () => {
        const location = Utils.makeRandomComputerMove(board)
        // expect(location.x).toBe(0)
        // expect(location.y).toBe(1)
    })
})

ticTacToe. js

export const getRandomNumber = (min, max) => {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

export const makeRandomComputerMove = (board) => {
    const location = {};
    location.x = getRandomNumber(0, board.length - 1);
    location.y = getRandomNumber(0, board.length - 1);
    if (location.x < 3 && location.y < 3) {
        return location

    }
    return makeRandomComputerMove(board);   
};

1 Ответ

1 голос
/ 25 февраля 2020

Вы не сможете смоделировать getRandomNumber, пока он вызывается makeRandomComputerMove в том же файле.

Вместо этого вы можете переместить getRandomNumber в отдельный файл, который затем может быть см .:

getRandomNumber. js

export const getRandomNumber = (min, max) => {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

ticTacToe. js

import { getRandomNumber } from './getRandomNumber';

export const makeRandomComputerMove = (board) => {
  const location = {};
  location.x = getRandomNumber(0, board.length - 1);
  location.y = getRandomNumber(0, board.length - 1);
  if (location.x < 3 && location.y < 3) {
    return location
  }
  return makeRandomComputerMove(board)
}

test.ticTacToe. js

import Utils from './'
import { getRandomNumber } from './getRandomNumber'

jest.mock('./getRandomNumber', () => ({
  getRandomNumber: jest.fn()
}))

describe('TicTacToe Utils', () => {
  getRandomNumber.mockReturnValueOnce(0)
  getRandomNumber.mockReturnValueOnce(1)

  const board = [
    [['X'], [], []],
    [[], [], []],
    [[], [], []]
    ]

  it('makeRandomComputerMove', () => {
    const location = Utils.makeRandomComputerMove(board)
    expect(location.x).toBe(0)
    expect(location.y).toBe(1)
  })
})

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...