reactjs - 使用 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()
})
})
})
解决方案
这是解决方案:
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
推荐阅读
- python - 从另一列中的每一行单元格中搜索字符串,如果找到匹配项,则在 pandas 中找到的匹配项下方插入行
- flutter - 如何让 SliverAppBar 在 sub_page 的 SliverList 之前滚动
- html - 如何在 Ionic 3 中水平对齐两个单选按钮
- javascript - 如何使用 express ntlm 实现用户名/密码验证?
- angular - 有没有办法从 angularJS 在 HDInsight 集群中运行配置单元查询?
- rabbitmq - RabbitMQ:当消费者关闭时发布消息,以后消费者不能在没有命名队列的情况下消费消息
- angular - Angular 服务构造函数阻塞单元测试
- cmake - CMAKE add_includes
- javascript - 从某个位置开始检查字符串是否与给定字符串匹配
- java - 将地图列表中的每个地图分开