Jest.js 如何在NodeJS中使用memfs模拟文件系统

hgb9j2n6  于 2023-09-28  发布在  Jest
关注(0)|答案(1)|浏览(160)

我想用memfs package测试以下函数

import fs from 'fs-extra'
import path from 'path'

async function ensureParent(filepath: string) {
  const absolutePath = path.resolve(filepath)
  const parentDir = path.dirname(absolutePath)

  const exists = await fs.pathExists(parentDir)

  return exists
}

export default {
  ensureParent,
}

为了使用位于项目根目录的内存文件系统测试它,可以使用以下__mocks__/fs.ts文件

import { fs } from 'memfs'

export default fs

和以下__mocks__/fs/promises.ts文件

import { fs } from 'memfs'

export default fs.promises

下面是测试文件file.test.ts

import { describe, it, expect, vi, beforeAll, beforeEach } from 'vitest'
import { vol } from 'memfs'

import f from '../file'

vi.mock('fs')
vi.mock('fs/promises')

const fileSystem = {
  './exists/shiman.txt': 'Hello shiman',
}

beforeAll(() => {
  vol.fromJSON(fileSystem, '/tmp')
})

beforeEach(() => {
  vol.reset()
})

describe.concurrent('file utils', () => {
  it('ensure a directory exists', async () => {
    expect(await f.ensureParent('/tmp/exists/shiman.txt')).toBe(true)
  })
})

然而,测试一直失败,我意识到,尽管考虑了mock,但内存中的文件系统并没有,因为await fs.readdir('/', (err, data) => console.log(err, data))在我的机器中记录了/的内容。
我做错什么了吗?

qlfbtfca

qlfbtfca1#

如果其他人偶然发现了这一点,这就是我的工作(在vitest中用memfs模拟fs/promises):

import { type fs, vol } from 'memfs'

// ...

vi.mock('node:fs/promises', async () => {
  const memfs: { fs: typeof fs } = await vi.importActual('memfs')

  return memfs.fs.promises
})

__mocks__中没有文件。

相关问题