首页 > 解决方案 > 使用 Jest 在 React-Native 中测试 firebase.messaging().subscribeToTopic()

问题描述

我在 Jest 中创建测试以确保函数正常工作。在我的测试中,我启动了我的函数并检查内部的函数是否已被调用。但是,我收到错误:

收到的值必须是模拟或间谍功能。

据我所知,我正在正确地模拟 firebase 并寻找正确的功能。任何帮助将不胜感激。

这是有问题的函数,在notifications.js文件中:

export async function subscribeToTopic(topic) {
    await firebase.messaging().subscribeToTopic(topic)
}

setupTest.js我在一个文件中模拟了firebase

import 'react-native-firebase'

jest.mock('react-native-firebase', () => ({
  messaging: jest.fn(() => ({
    hasPermission: jest.fn(() => Promise.resolve(true)),
    subscribeToTopic: jest.fn(),
    unsubscribeFromTopic: jest.fn(),
    requestPermission: jest.fn(() => Promise.resolve(true)),
    getToken: jest.fn(() => Promise.resolve('myMockToken')),
  })),
  notifications: jest.fn(() => ({
    onNotification: jest.fn(),
    getInitialNotification: jest.fn(),
  })),
}))

这是我的测试notifications.test.js

import { subscribeToTopic } from './notifications'
import firebase from 'react-native-firebase'

describe('notifications', () => {
  describe('topics', () => {
    const topic = 'topic'
    it('should subscribe to a topic', async () => {
      subscribeToTopic(topic)
      await expect(firebase.messaging().subscribeToTopic).toHaveBeenCalled()
    })
  })
}) 

标签: reactjsfirebaseunit-testingreact-nativejestjs

解决方案


这是解决方案:

notifications.ts

import firebase from 'react-native-firebase';

export async function subscribeToTopic(topic) {
  await firebase.messaging().subscribeToTopic(topic);
}

notifications.test.ts

import { subscribeToTopic } from './notifications';
import firebase from 'react-native-firebase';

jest.mock('react-native-firebase', () => {
  return {
    messaging: jest.fn().mockReturnThis(),
    subscribeToTopic: jest.fn()
  };
});

describe('notifications', () => {
  describe('topics', () => {
    const topic = 'topic';
    it('should subscribe to a topic', async () => {
      await subscribeToTopic(topic);
      expect(firebase.messaging().subscribeToTopic).toHaveBeenCalled();
    });
  });
});

覆盖率 100% 的单元测试结果:

 PASS  src/stackoverflow/58859904/notifications.spec.ts
  notifications
    topics
      ✓ should subscribe to a topic (5ms)

------------------|----------|----------|----------|----------|-------------------|
File              |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
------------------|----------|----------|----------|----------|-------------------|
All files         |      100 |      100 |      100 |      100 |                   |
 notifications.ts |      100 |      100 |      100 |      100 |                   |
------------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.844s, estimated 10s

源代码:https ://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58859904


推荐阅读