我最近加入了一个团队,担任测试工程师,我正试图在我们的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 Modules时出现的(同样,在我加入团队之前)。
经过一些研究后,我决定继续假设,这与Jest无法解析提供给Native Modules的引擎中的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 mock被提升到import语句之上的概念,但我不清楚为什么这些mock会出现在上面链接的问题中的describe块中(除了为每个新测试重置mock函数,以免混淆.mock属性的返回数据...我离题了)。
在我看来,错误似乎发生在导入过程中,在执行任何代码之前。为了测试这一点,我来回地注释掉了除import语句和mock之外的所有内容。这样做,我仍然得到相同的错误。当我使用beforeEach() mocha语句时也是如此,就像上面链接的问题的解决方案一样。
修复此错误的唯一方法是完全注释掉导入。
我还没有尝试过错误处理(try/ catch ),因为如果执行catch块,我不确定如何成功地导入正在测试的组件。
很抱歉有这么多背景知识。我已经在这上面花了几个工作日,所以我想确保我所有的基础都被覆盖了。
下面是一个示例测试:
/__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()块都是我断断续续尝试过的,但都无济于事。
在尝试跟踪此错误时,我发现在运行脚本(因为ES6导入会运行它引用的脚本)的原始Splash.js中注释掉import语句可以修复我看到的错误。正如您可能已经从堆栈跟踪中收集到的,这些都深入到很多层次。
呼。如果你已经读到这里,我真的很感谢你的帮助。
很抱歉问了这么长这么复杂的问题。如您所见,我们有一个庞大而复杂的堆栈。上面问题的修复可能不起作用,因为在出现错误之前发生了多少链式导入。
如果它是我遗漏的一个小补丁,或者如果有某种我不知道的“浅层”-ish导入,我会很高兴的。
非常感谢你的帮助。欢迎任何意见。
发布于 2018-11-28 09:30:44
我找到了解决这个问题的办法。我一直在担心,也许所有的import语句都没有跟踪到mock。真正发生的事情是我把mock的格式设置错了。
我没有在标准的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
};
});为了后人着想,我认为最好将它保存在自己的脚本中,并导入到测试中……我还没试过这个呢。
https://stackoverflow.com/questions/53510385
复制相似问题