如何使用Jest模拟第三方模块

时间:2017-09-11 14:58:04

标签: javascript node.js jestjs

我目前已在我的测试目标中导入:

import sharp from 'sharp'

并在我的同一测试目标中使用它:

return sharp(local_read_file)
    .raw()
    .toBuffer()
    .then(outputBuffer => {

在我的测试中,我正在做下面的模拟功能:

jest.mock('sharp', () => {
  raw: jest.fn()
  toBuffer: jest.fn()
  then: jest.fn()
})

但我得到了:

  return (0, _sharp2.default)(local_read_file).
                             ^
TypeError: (0 , _sharp2.default) is not a function

有没有办法可以使用Jest使用函数模拟所有Sharp模块函数?

1 个答案:

答案 0 :(得分:9)

你需要像这样嘲笑:

jest.mock('sharp', () => () => ({
        raw: () => ({
            toBuffer: () => ({...})
        })
    })

首先,您需要返回函数而不是对象,因为您调用sharp(local_read_file)。此函数调用将返回一个带有键raw的对象,该对象包含另一个函数,依此类推。

为了测试您调用的每个函数,您需要为每个函数创建一个间谍。由于你不能在最初的模拟调用中使用它,你可以先用间谍模拟它并稍后添加模拟:

jest.mock('sharp', () => jest.fn())

import sharp from 'sharp' //this will import the mock

const then = jest.fn() //create mock `then` function
const toBuffer = jest.fn({()=> ({then})) //create mock for `toBuffer` function that will return the `then` function
const raw = jest.fn(()=> ({toBuffer}))//create mock for `raw` function that will return the `toBuffer` function
sharp.mockImplementation(()=> ({raw})) make `sharp` to return the `raw` function