Верните дубль в Jest JS - PullRequest
       3

Верните дубль в Jest JS

2 голосов
/ 11 апреля 2019

У меня есть такая простая функция, которую я хочу проверить:

const saveAs = (fileName, content, contentType) => {
 const a = createDownloadLink(fileName, content, contentType)
 a.click()
}

export const createDownloadLink = (fileName, content, contentType) => {
 ...
 const a = document.createElement('a')
 ...
 return a
}

export default saveAs

Я хочу проверить, что когда я вызываю saveAs, вызывается createDownloadLink и click вызывается в результате.

Я попытался насмехаться createDownloadLink и создать на нем шпиона. Тем не менее, я не могу найти, как проверить клик на результат:

Jest JS тест:

  const createDownloadLink = jest.fn()
  saveAs('file.html', '<h1>hello</h1>', 'test/plain;UTF-8')
  expect(createDownloadLink).toBeCalled() // And return a double
  // expect(double.click).toBeCalled
})

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Я знаю, что вы уже ответили на свой вопрос, но, поскольку вы заявили, что вам не нравится разделять свою функциональность на два файла, у меня может быть альтернативное решение.Так как вы все равно экспортируете обе функции, могу ли я предложить вам сделать обе части одного и того же объекта?Это позволит вам легко издеваться или шпионить за функцией модуля.Например, давайте предположим, что у вас есть saver.js:

class Saver {
  saveAs(fileName, content, contentType) {
    const a = this.createDownloadLink(fileName, content, contentType)
    a.click()
  }

  createDownloadLink(fileName, content, contentType) {
    const a = document.createElement('a')
    return a
  }
}

const saver = new Saver();
export default saver;

Тогда ваш тест будет выглядеть так:

import saver from './saver'

describe('saveAs', () => {
  it("calls click on download link", () => {
    const click = jest.fn()
    saver.createDownloadLink = jest.fn(() => ({ click }));
    saver.saveAs('file.html', '<h1>hello</h1>', 'test/plain;UTF-8')
    expect(click).toHaveBeenCalled();
  })
})
0 голосов
/ 11 апреля 2019

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

К сожалению, мне пришлось разделить свою функциональность на 2 файла, чтобы использовать `jest.mock.

import saveAs from './index'
import createDownloadLink from './utils'
jest.mock("./utils");

describe('saveAs', () => {
  it("calls click on download link", () => {
    const downloadLinkDouble = {}
    const clickMock = jest.fn()
    downloadLinkDouble.click = clickMock
    createDownloadLink.mockImplementation(() => downloadLinkDouble)

    saveAs('file.html', '<h1>hello</h1>', 'test/plain;UTF-8')

    expect(clickMock).toHaveBeenCalled()
  })
})

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