无法与Sinon模拟节点fs模块

时间:2019-08-04 16:05:19

标签: javascript node.js typescript sinon

我无法正确模拟节点className模块的promises方法。

我的fs文件调用了真正的appData.ts方法,而不是我在fs.promises.mkdir中声明的模拟。

我认为问题是由于模拟方法如何嵌套在导入的模块\__tests__/appData.test.js中作为fs而引起的。但是我当然不确定。

我知道我应该可以调试此问题,但是我认为我需要一些经验丰富的人的帮助。

appData.ts

fs.promises.readdir

__ tests __ / appData.js

import * as fs from 'fs'
import { app } from 'electron'
const { readdir, mkdir } = fs.promises

/**
 * Initialize app data dir.
 * @param {string} path Where to initialize app data dir.
 */
export async function initDir(path: string): Promise<void> {
  try {
    await readdir(path)
    console.log(`app data dir exists at ${path}`)
  } catch (error) {
    if (error.code === 'ENOENT') {
      try {
        await mkdir(path)
        console.log(`created app data dir at ${path}`)
      } catch (error) {
        console.error(`could not create app data dir at ${path}`)
        console.error(error)
        app.quit()
      }
    } else {
      console.error('unable to handle error while initializing app data dir')
      console.error(error)
      app.quit()
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我发现导致模拟无法正常工作的行。

appData.ts

...
const { readdir, mkdir } = fs.promises
...

这对我来说很有意义。不管我模拟fs.promises方法是什么,考虑到导入appData.ts时,fs.promises都会被分解为\__tests__/appData.test.js无法接触的变量。

如果我想保持解构,可以在initDir()内执行。这允许appData.ts\__tests__/appData.test.js运行时访问模拟initDir