1

Я использую react-native-fcm и jest для проверки моего приложения React Native. У меня есть довольно основной тест, это выглядит следующим образом:React Native jest test: TypeError: Невозможно прочитать свойство «unsubscribeFromTopic» неопределенного

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 не определено. Есть идеи?

ответ

3

Мне удалось решить это, наконец! Мне просто нужно было изменить мой тест на

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 /> 
); 
}); 

Чтобы убедиться, что фактические звонки издеваются. Я сделал много googling до этого, поэтому я уверен, что это будет полезно для кого-то.

 Смежные вопросы

  • Нет связанных вопросов^_^