gpt4 book ai didi

javascript - React Native Jest 测试 : TypeError: Cannot read property 'unsubscribeFromTopic' of undefined

转载 作者:行者123 更新时间:2023-11-29 17:04:23 25 4
gpt4 key购买 nike

我正在使用 react-native-fcmjest 来测试我的 React Native 应用程序。我有一个非常基本的测试,它看起来像这样:

import 'react-native';
import React from 'react';
import PushController from '../app/PushController';
// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';

it('works correctly', () => {
const tree = renderer.create(
<PushController />
);
});

PushController 有点大,所以这是有趣的部分

import React, { Component } from 'react';
import { AsyncStorage } from 'react-native';
import FCM from 'react-native-fcm';

export default class PushController extends Component {
(...)

componentDidMount() {
if (this.notificationListener) this.notificationListener.remove();

this.notificationListener = FCM.on('notification', (notif) => {

if (!notif.local_notification) {
this.notifyUser(notif.coffee);
}

});
FCM.unsubscribeFromTopic('/topics/coffee');
FCM.subscribeToTopic('/topics/coffee');
}
(...)

但是,在运行测试时我得到了

__tests__/PushControllerTest.js
● works correctly

TypeError: Cannot read property 'unsubscribeFromTopic' of undefined

at Object.FCM.unsubscribeFromTopic (node_modules/react-native-fcm/index.js:86:15)
at PushController.componentDidMount (app/PushController.js:44:26)
at node_modules/react-test-renderer/lib/ReactCompositeComponent.js:265:25
at measureLifeCyclePerf (node_modules/react-test-renderer/lib/ReactCompositeComponent.js:75:12)
at node_modules/react-test-renderer/lib/ReactCompositeComponent.js:264:11
at CallbackQueue.notifyAll (node_modules/react-test-renderer/lib/CallbackQueue.js:76:22)
at ReactTestReconcileTransaction.ON_DOM_READY_QUEUEING.close (node_modules/react-test-renderer/lib/ReactTestReconcileTransaction.js:36:26)
at ReactTestReconcileTransaction.TransactionImpl.closeAll (node_modules/react-test-renderer/lib/Transaction.js:206:25)
at ReactTestReconcileTransaction.TransactionImpl.perform (node_modules/react-test-renderer/lib/Transaction.js:153:16)
at batchedMountComponentIntoNode (node_modules/react-test-renderer/lib/ReactTestMount.js:69:27)

我已经尝试在测试中包含很多东西,例如 jest.mock('react-native-fcm') 等,但我根本无法让它工作。我知道 jest 会自动模拟库,但我不明白为什么 FCM 未定义。有什么想法吗?

最佳答案

终于解决了!只需要将我的测试更改为

import 'react-native';
import React from 'react';
import PushController from '../app/PushController';
// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';
import FCM from 'react-native-fcm'; // <-- This

it('works correctly', () => {
FCM.unsubscribeFromTopic = jest.fn(); // <-- These two
FCM.subscribeToTopic = jest.fn();
const tree = renderer.create(
<PushController />
);
});

确保模拟实际调用。在此之前,我用谷歌搜索了很多,所以我相信这会对某些人有用。

关于javascript - React Native Jest 测试 : TypeError: Cannot read property 'unsubscribeFromTopic' of undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42141783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com