【问题标题】:Unable to Mock Node fs Modules with Sinon无法使用 Sinon 模拟节点 fs 模块
【发布时间】:2019-08-04 16:05:19
【问题描述】:

我无法正确模拟节点 fs 模块的承诺方法。

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

我认为问题的出现是由于模拟方法如何嵌套在导入的模块fs 中作为fs.promises.readdir。但我当然不确定。

我知道我应该能够调试这个问题,但我认为我需要一些更有经验的人的帮助。

appData.ts

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()
    }
  }
}

__tests__/appData.js

import * as appData from '../appData'
import { stub } from 'sinon'
import * as fs from 'fs'
require('chai').should()

describe('appData', () => {

  describe('initDir()', () => {

    it ('creates app data dir at passed path when it is missing', async () => {
      const noentError = new Error()
      noentError.code = 'ENOENT'
      const readdirStub = stub(fs.promises, 'readdir').throws(noentError)
      const mkdirStub = stub(fs.promises, 'mkdir').resolves(true)
      const expected = 'a/b/c'
      await appData.initDir(expected)
      mkdirStub.args[0][0].should.equal(expected)
    })

  })

})

【问题讨论】:

    标签: javascript node.js typescript sinon


    【解决方案1】:

    我找到了导致模拟不起作用的行。

    appData.ts

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

    这对我来说很有意义。我模拟 fs.promises 方法并不重要,考虑到当 appData.ts 被导入时,fs.promises 被解构为 \__tests__/appData.test.js 无法触及的变量。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2020-07-11
      相关资源
      最近更新 更多