У меня есть очень простая маленькая служебная функция
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)
})
})
, но это не имело значения