Как создать макет firebase.database.Функция ServerValue.increment() с использованием Jest

#javascript #firebase #jestjs

# #javascript #firebase #jestjs

Вопрос:

У меня есть компонент, обновляющий переменные пользователя:

 const sendPost = () => {

   let userProps = {

       name: userName,
       profilePic: userPhoto,
       numPosts: firebase.database.ServerValue.increment(1)

   }

   firebase.database().ref(`user/${uid}`).update(userProps);

}
 

Чтобы протестировать компонент, я хочу создать макет для firebase.database.ServerValue.increment() использования Jest.

Мой тест до сих пор:

 import React                                  from 'react';
import { render, fireEvent, screen, waitFor } from '@testing-library/react';
import { BrowserRouter }                      from 'react-router-dom';
import NewPost                                from '../Components/NewPost';
import firebase                               from '../Functions/Firebase';
import UserContext                            from '../Functions/UserContext';
import * as GetLevel                          from '../Functions/GetLevelAndPointsToNextLevel';

test('NewPost -> Users with level < 15 (premium) are allowed to publish new posts', async () => {
   
    jest.spyOn(GetLevel, 'default').mockImplementation(() => [14, '_', '_']);
    
    const userInfo = { 
        
        account: 'premium'
        
    };
    
    const snapshot = { val: () => userInfo };    
    
    jest.spyOn(firebase, 'database').mockImplementation(() => ({
        
        ref:         jest.fn().mockReturnThis(),
        on:          jest.fn((event, callback) => callback(snapshot)),
        off:         jest.fn().mockReturnThis(),
        once:        jest.fn(() => Promise.resolve({val: () => 0})),
        push:        jest.fn().mockReturnThis(),
        update:      jest.fn().mockReturnThis(),
        transaction: jest.fn().mockReturnThis(),
        ServerValue: jest.fn().mockReturnThis()
        
    }));
    
    render(
        <UserContext.Provider value = {{user: true}}>
            <NewPost/>
        </UserContext.Provider>
    );
    
    fireEvent.change(screen.getByPlaceholderText('Título...'),  { target: { value: 'Some random title' } });
    fireEvent.change(screen.getByPlaceholderText('Mensaje...'), { target: { value: 'Some random message' } });
    
    fireEvent.click(document.querySelector('button.bottom'));
    
    await waitFor(() => expect(document.querySelector('.Alert .Message').textContent).toBe('¡Mensaje enviado!'));
    
});

 

Проблема в том, что после выполнения теста я получаю следующее:

Ошибка типа: не удается прочитать свойство ‘increment’ undefined

Компонент E2E хорошо работает. Так что это проблема правильной настройки функции.

Как я могу firebase.database.ServerValue.increment() правильно смоделировать?

Комментарии:

1. Можете ли вы рассказать больше о реализации вашего компонента и его тестировании? Тогда мы могли бы предоставить вам правильное исправление.

2. Функция, которую я хочу создать, находится здесь firebase.google.com/docs/reference/kotlin/com/google/firebase /. … Меня не волнует значение, возвращаемое в макете. Я не уверен, что было бы полезно поделиться дополнительной информацией о моей реализации. Не могли бы вы уточнить, пожалуйста?

3. Я не против, какой пакет вы использовали. Я просто забочусь о том, как вы импортируете вещи и издеваетесь над ними, где вы в настоящее время размещаете свой код. Вот почему я попросил просмотреть весь ваш компонент и тестовые файлы

4. Понял. Я только что отредактировал вопрос, надеюсь, это поможет.

5. Подождите. Предполагается database , что это функция, основанная на вашем макете. Вы забыли ее вызвать? firebase.database.ServerValue (должно быть firebase.database().ServerValue )