我最近作为测试工程师加入了一个团队,我正在尝试在我们的 React Native 应用程序上启动和运行 Jest 单元测试。我的前任已经编写了数十个单元测试,其中大部分都没有成功运行。
运行 npm test
时出现以下错误
FAIL __tests__/index.test.js
● Test suite failed to run
TypeError: Cannot read property '_addDeviceToGroup' of undefined
4 | } from 'react-native';
5 | const {
> 6 | _addDeviceToGroup,
| ^
7 | } = NativeModules._BleAssociator
8 | const {
9 | _queryName,
at Object._addDeviceToGroup (app/utils/mesh.js:6:3)
at Object.<anonymous> (app/actions/hierarchy.js:26:1)
at Object.<anonymous> (app/actions/organizations.js:14:1)
问题似乎是在我们实现后端团队编写的自定义 native 模块时出现的(同样是在我加入团队之前)。
经过一些研究,我决定继续假设这与 Jest 无法解析在 native 模块中提供的引擎中的 Objective-C 有关,而不是我们的堆栈存在问题(很高兴考虑这种可能性) ,不过)。
我已经审阅了 Jest 文档,并专门梳理了几个相关文档( Mock Functions 、 Using Jest with ES Module Imports 、 Testing Native Modules with Jest Mock 、 React Native Modules Guide )
我的问题似乎与 this issue 相同;但是,该修复对我不起作用。即使在模拟 NativeModules 时,我也会遇到同样的错误。
我已经熟悉了 Jest 模拟被提升到 import 语句之上的概念,但我不清楚为什么这些模拟位于我上面链接的问题中的描述 block 中(除了可能重置模拟函数之外)对于每个新测试,以防混淆 .mock 属性的返回数据……我离题了)。
对我来说,错误似乎是在导入期间发生的,在执行任何代码之前。为了测试这一点,我来来回回,注释掉除了导入语句和模拟之外的所有内容。这样做,我仍然遇到同样的错误。当我使用 beforeEach() mocha 语句时也是这种情况,如上面链接的问题的解决方案。
修复此错误的唯一方法是完全注释掉导入。
我还没有尝试过错误处理(try/catch),因为我不确定如果执行了 catch block ,我如何仍然可以成功导入我正在测试的组件。
对所有的背景感到抱歉。我在这上面花了几个工作日,所以我想确保我的所有基础都得到了覆盖。
这是一个示例测试:
/__tests__/app/components/Onboarding/Splash/Splash.test.js
import {
NativeModules,
} from 'react-native';
import { Splash } from '../../../../../app/components/Onboarding/Splash/Splash.js';
// import login from '../../../../../app/actions/login';
// NativeModules._BleAssociator._addDeviceToGroup = jest.fn();
// login = jest.fn;
export default function({React, shallow}) {
const props = {
// some test props
};
function make({navigation, getUserInfo, verifyUser, login} = props) {
return shallow(
// renders the component with props
);
}
describe('<Splash />', () => {
// I added this part (didn't help)
beforeEach(() => {
NativeModules._BleAssociator._addDeviceToGroup = jest.fn();
login = jest.fn;
});
// end part I added
// stuff (all the tests are in here)
});
}
NativeModules 和登录导入、注释掉的行以及 beforeEach() block 是我间歇性尝试过的但无济于事。
当尝试跟踪此错误时,我发现在运行尝试导入 NativeModules 的脚本(因为 ES6 import 运行它引用的脚本)的原始 Splash.js 中注释掉 import 语句可以修复我看到的错误。正如您可能已经从堆栈跟踪中收集到的那样,这些深入了许多层次。
唷。如果您已经读到这里,非常感谢您的帮助。
很抱歉有这么长而复杂的问题。如您所见,我们有一个庞大而复杂的堆栈。上述问题的修复可能不起作用,因为在出现错误之前发生了多少链式导入。
如果它是一个我遗漏的小修复程序,或者如果有某种我不知道的“浅层”导入,我会喜欢它。
非常感谢您的帮助。欢迎任何意见。
最佳答案
我找到了解决这个问题的方法。我一直担心模拟可能没有通过所有导入声明进行跟踪。真正发生的是我错误地格式化了模拟。
我没有在标准的 Jest 文档中看到它,而是找到了它 here .
将此添加到我的 *.test.js 文件中有效:
import { NativeModules } from 'react-native';
jest.mock('NativeModules', () => {
return {
_BleAssociator: {
_addDeviceToGroup: jest.fn()
},
// ... and so on for all the other methods expected in NodeModules
};
});
为了后代,我认为最好将其保存在自己的脚本中并导入到测试中……我还没有尝试过。
关于javascript - 开 Jest : Error when trying to import Native Modules; unable to prevent with Mock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53510385/