首页 > 解决方案 > 如何使用 jest TypeError 正确模拟 react-native-firebase/数据库方法:无法读取未定义的属性“on”

问题描述

我正在使用 Jest 对我的 react-native 应用程序进行单元测试,并且在模拟数据库响应时遇到了问题。我得到TypeError: Cannot read property 'on' of undefined了我的代码的结果,但不确定为什么它没有得到我的模拟值。

我的组件.js

export const myMethod = (myUserId) => {
    return async dispatch => {
        console.log('getting data.... ')
        let loadedData = [];
        try{
            
            await database().ref('/myPath/' + myUserId).limitToLast(3).on('value', (snapshot) => {
                console.log('snapshot  ' + JSON.stringify(snapshot.val()))
                loadedData = snapshot.val(); 
                console.log('loadedData  ' + JSON.stringify(loadedData))
                let objArr = Utils.getArrayOfObjs(loadedData);
                objArr.sort(Utils.compareDatesDesc);
                console.log('objArr  ' + JSON.stringify(objArr))
                 dispatch({ 
                    type: LOAD_DATA,
                    myData: objArr,
                }); 
            });   
           
        }catch(err){
            console.log('err: ' + err)
        }
    };
};

在 __ mocks __/@react-native-firebase/database.js 我有:

export default () => ({
    

    ref: jest.fn().mockReturnThis(),
    on: jest.fn((eventType, callback) => {
        const data = {
            "1234":{
               "length":"21",
               "userId":"xx01"
            }
        };

        const snapshot = { val: () => data, exportVal: () => data, exists: jest.fn(() => true) };

        console.log('snapshot: ' + JSON.stringify(snapshot))
        return callback(snapshot)
    
    }),
    limitToLast: jest.fn()
  });

MyComponent-test.js

import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'

const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)

test('successful LoadData', async () => {
    const store = mockStore({ user: {} })

    const expectedActionResult = [{
        myData:[{
            "length":"21",
            "userId":"xx01"
        }],
        type: 'LOAD_DATA'
    }];

标签: react-nativeunit-testingjestjsmockingreact-native-firebase

解决方案


推荐阅读