5

我正在尝试使用react-native-testing-library和 Jest 设置我的 react-native 测试环境。我的 react-native 应用程序使用react-native-encrypted-storage. 当我运行我的第一个示例测试(下面的代码)时,它失败说RNEcryptedStorage未定义。

import React from "react";
import "react-native";
// Note: test renderer must be required after react-native.
import renderer from "react-test-renderer";
import App from "../App";
    
it("renders correctly", () => {
    console.log("Rendering");
    renderer.create(<App />);
});

完整错误:

RNEncryptedStorage 未定义

在对象。(node_modules/react-native-encrypted-storage/lib/commonjs/EncryptedStorage.ts:7:9)在对象。(node_modules/react-native-encrypted-storage/lib/commonjs/index.ts:1:1)

这是我第一次设置我的测试环境,所以不知道从哪里开始解决这个问题。

4

2 回答 2

3

您可以在测试期间通过向文件夹添加模拟来模拟本RNEncryptedStorage机模块。react-native__mocks__

// tests/__mocks__/react-native.js

module.exports = {
    NativeModules: {
        RNEncryptedStorage: {
            setItem: jest.fn(() => Promise.resolve()),
            getItem: jest.fn(() => Promise.resolve('{ "foo": 1 }')),
            removeItem: jest.fn(() => Promise.resolve()),
            clear: jest.fn(() => Promise.resolve())
        }
    }
}
于 2021-06-13T13:57:56.330 回答
3

以上将起作用,但是如果您模拟 react-native 的其他方面,则可能会与其他模拟产生问题。如果您想自己模拟 RNEncryptedStorage,您可以尝试对上述解决方案稍作改动:

__mocks__/react-native-encrypted-storage/index.js


const RNEncryptedStorage = {
  setItem: jest.fn(() => Promise.resolve()),
  getItem: jest.fn(() => Promise.resolve('{ "foo": 1 }')),
  removeItem: jest.fn(() => Promise.resolve()),
  clear: jest.fn(() => Promise.resolve()),
};

export default RNEncryptedStorage;

于 2021-09-03T07:55:42.423 回答