javascript - 无法使用 Sinon 模拟节点 fs 模块
问题描述
我无法正确模拟节点fs
模块的承诺方法。
我的appData.ts
文件调用了真正的fs.promises.mkdir
方法,而不是我在\__tests__/appData.test.js
.
我认为问题的出现是由于模拟方法是如何嵌套在导入的模块fs
中的fs.promises.readdir
. 但我当然不确定。
我知道我应该能够调试这个问题,但我认为我需要一些更有经验的人的帮助。
应用数据.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)
})
})
})
解决方案
我发现导致模拟不起作用的行。
应用数据.ts
...
const { readdir, mkdir } = fs.promises
...
这对我来说很有意义。fs.promises
我要考虑什么时候模拟方法并不重要,什么时候appData.ts
被导入,被解构为无法触及fs.promises
的变量。\__tests__/appData.test.js
如果我想保留解构,我可以在initDir()
. 这允许在运行时appData.ts
访问模拟。\__tests__/appData.test.js
initDir
推荐阅读
- azure-data-factory - 使用 Azure 数据工厂对 ZIP 文件进行密码保护
- python - 基于二维布尔掩码屏蔽 3-D numpy 数组的行和列
- javascript - 使用绑定将参数传递给事件监听器中的命名函数
- angular - 选择后离子不显示画廊中的照片
- drop-down-menu - 单击外部并单击另一个下拉菜单时如何关闭下拉菜单
- spring - 基于接口的投影的返回类型
- java - 带有条件JAVA的SQL选择列
- java - Spring Cloud Stream kafka-streams 应用程序因反序列化异常而关闭
- hdf5 - 如何在没有中间缓冲区的情况下组合两个 HDF5 数据集
- java - 如何使用 RxJava 对来自异步源的数据进行分组