【发布时间】: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