为什么 expo-file-system 在 Jest 中不起作用?



我正在尝试为我的小项目编写一些测试。我们使用 expo-file-system 来允许我们访问 IOS 内部存储。这是我对保存函数的测试。

import SaveData from "../app/resources/SaveData/SaveData"
import * as FileSystem from 'expo-file-system';
var promiseHolder = 0;
describe('nsaveNewFile() is tested.n', ()=>{
it("A file is going to be created.",async ()=>{
await FileSystem.writeAsStringAsync("sometext","test.txt");
promiseHolder = await FileSystem.getInfoAsync("test.txt");
testHolder = await FileSystem.readAsStringAsync("test.txt");
console.log(promiseHolder)
console.log(testHolder)
});
});

这是输出。 命令行输出

看起来FileSystem.documentDirectory在测试中不起作用,但是我们的应用程序运行良好。我该怎么办?

如果你看node_modulesjest-exposrcpresetsetup.js你可以找到jest.mock("expo-file-system", () => ({...}));调用。

请注意,模拟中不包含documentDirectory属性,这就是在运行测试时undefined属性的原因。

我不知道如何在开玩笑中获取模块的当前模拟集(即我们经常在...jest.requireActual(...)中看到的那样(,所以如果你想给documentDirectory一个值,我看到的最佳解决方案是复制\粘贴整个jest.mock(...)调用到你的测试文件,并在运行测试之前documentDirectory添加到模拟模块。

即。

jest.mock('expo-file-system', () => ({
downloadAsync: jest.fn(() => Promise.resolve({ md5: 'md5', uri: 'uri' })),
getInfoAsync: jest.fn(() => Promise.resolve({ exists: true, md5: 'md5', uri: 'uri' })),
readAsStringAsync: jest.fn(() => Promise.resolve()),
writeAsStringAsync: jest.fn(() => Promise.resolve()),
deleteAsync: jest.fn(() => Promise.resolve()),
moveAsync: jest.fn(() => Promise.resolve()),
copyAsync: jest.fn(() => Promise.resolve()),
makeDirectoryAsync: jest.fn(() => Promise.resolve()),
readDirectoryAsync: jest.fn(() => Promise.resolve()),
createDownloadResumable: jest.fn(() => Promise.resolve()),
documentDirectory: "file:///test-directory/",
}));

你没有像promiseHolder那样声明testHolder变量。

import SaveData from "../app/resources/SaveData/SaveData";
import * as FileSystem from 'expo-file-system';
var promiseHolder = 0;
var testHolder = 0;
describe('nsaveNewFile() is tested.n', ()=>{
it("A file is going to be created.",async ()=>{
await FileSystem.writeAsStringAsync("sometext","test.txt");
promiseHolder = await 
FileSystem.getInfoAsync("test.txt");
testHolder = await FileSystem.readAsStringAsync("test.txt");
console.log(promiseHolder)
console.log(testHolder)
});
});

你没有像promiseHolder那样声明gan变量。

import SaveData from "../app/resources/SaveData/SaveData";
import * as FileSystem from 'expo-file-system';
var promiseHolder = 0;
var testHolder=0;
describe('nsaveNewFile() is tested.n', ()=>{
it("A file is going to be created.",async ()=>{
let fileUri = FileSystem.documentDirectory + "text.txt";
await FileSystem.writeAsStringAsync(flileUri, "cao");
promiseHolder = await 
FileSystem.getInfoAsync(fileUri);
testHolder = await FileSystem.readAsStringAsync(fileUri);
console.log(promiseHolder)
console.log(testHolder)
});
});

更新: expo-jest 为文件系统等导入制作模型,并在测试中收到的结果打算预定义的模型预设。

最新更新