Как я использую шутку, чтобы издеваться над обещанной функцией - PullRequest
0 голосов
/ 21 января 2019

У меня есть очень простая маленькая служебная функция

xml2JSON следующим образом

import { promisify } from 'util'
import { parseString } from 'xml2js'

const xml2js = promisify(parseString)

const xmlToJSON = async xml => xml2js(xml)

export default xmlToJSON

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

import * as util from 'util'
import * as xml2js from 'xml2js'

import xmlToJSON from './xmlToJSON'

jest.mock('util')
jest.mock('xml2js')

describe('xmlToJSON', () => {
  const promisifiedParseString = jest.fn()
  util.promisify = jest.fn(() => promisifiedParseString)
  const js = { some: 'result' }
  const xml = '<some>result</some>'
  let result

  beforeAll(async () => {
    promisifiedParseString.mockResolvedValue(js)
    result = await xmlToJSON(xml)
  })

  it('promisified the original parseString', () => {
    expect(util.promisify).toHaveBeenCalledWith(xml2js.parseString)
  })

  it('called the promisified parseString with the xml', () => {
    expect(promisifiedParseString).toHaveBeenCalledWith(xml)
  })

  it('returned the expected result', () => {
    expect(result).toEqual(js)
  })
})

Но я получаю сообщение об ошибке

TypeError: xml2js is not a function

  4 | const xml2js = promisify(parseString)
  5 | 
> 6 | const xmlToJSON = async xml => xml2js(xml)
    |                                ^
  7 | 
  8 | export default xmlToJSON
  9 | 

Что я делаю не так?

Обновление

Основываясь на предложении ниже, я попытался изменить порядок импорта

import * as util from 'util'
import * as xml2js from 'xml2js'

jest.mock('util')
jest.mock('xml2js')
const promisifiedParseString = jest.fn()
util.promisify = jest.fn(() => promisifiedParseString)
import xmlToJSON from './xmlToJSON'

describe('xmlToJSON', () => {
  const js = { some: 'result' }
  const xml = '<some>result</some>'
  let result

  beforeAll(async () => {
    promisifiedParseString.mockResolvedValue(js)
    result = await xmlToJSON(xml)
  })

  it('promisified the original parseString', () => {
    expect(util.promisify).toHaveBeenCalledWith(xml2js.parseString)
  })

  it('called the promisified parseString with the xml', () => {
    expect(promisifiedParseString).toHaveBeenCalledWith(xml)
  })

  it('returned the expected result', () => {
    expect(result).toEqual(js)
  })
})

, но это не имело значения

1 Ответ

0 голосов
/ 21 января 2019

Вам необходимо изменить поведение util.promisify, прежде чем импортировать файл, который его использует.

Таким образом, порядок должен быть примерно таким:

util.promisify = jest.fn(() => promisifiedParseString)
import xmlToJSON from './xmlToJSON'
...