Проблема с насмешкой над функцией в модуле - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь создать простой тест для модуля. Я получил несколько триггеров пожарного магазина в модуле (см. Файл модуля ниже). В триггере onDelete я хочу просто проверить, вызван ли deleteColletion. Для этого мне нужно смоделировать только функцию deleteCollection. В моем тесте (см. onDelete should also delete the sub-collections trails and downloads в тестовом файле) я высмеиваю функцию deleteCollection, вызываю триггер пожарного депо и проверяет, вызван ли deleteCollection. Это неверный ответ, который я получаю из теста:

Error: expect(jest.fn()).toBeCalled()

Expected number of calls: >= 1
Received number of calls:    0

Кажется, что jest не соответствует ни одной функции, которую я высмеиваю. Что я делаю не так?

Внимание! Я теперь, что этот тест сам по себе не является хорошим тестом;)

Тестовый файл

const functions = require('firebase-functions-test');
const admin = require('firebase-admin');
const triggers = require("../../data/protocol/triggers");
const {createEvent} = require("../test_utilities");
const testEnv = functions();


const mockUpdate = jest.fn();
mockUpdate.mockReturnValue(true);

jest.mock("firebase-admin", () => ({
        initializeApp: jest.fn(),
        firestore: () => ({
            batch: jest.fn(() => ({commit: jest.fn()})),
            collection: () => (
                {
                    doc: () => ({update: mockUpdate}),
                    orderBy: () => ({
                        limit: jest.fn(() => ({
                            get: jest.fn(() => ({
                                size: 0,
                                docs: {
                                    forEach: jest.fn(),
                                }
                            }))
                        }))
                    })
                }
            )
        }),
    })
);

jest.mock('../../data/protocol/triggers', () => ({
        ...(jest.requireActual('../../data/protocol/triggers')),
        deleteCollection: jest.fn(() => [])
    })
);


describe("Protocol trigger", () => {
    let adminStub, triggersStub, api;
    const context = {
        params: {
            protocolId: 0,
        }
    };

    beforeAll(() => {
        adminStub = jest.spyOn(admin, "initializeApp");
        //triggersStub = jest.spyOn(triggers, 'deleteCollection');
        api = require("../../index");
    });

    beforeEach(() => jest.clearAllMocks());

    afterAll(() => {
        adminStub.mockRestore();
        //triggersStub.mockRestore();
        testEnv.cleanup();
    });


   ...

    it('`onDelete` should also delete the sub-collections `trails` and `downloads`', async () => 
    {
        const onDeleteProtocol = testEnv.wrap(api.onDeleteProtocol);
        const event = {id: 0};

        await onDeleteProtocol(event, {});

        expect(triggers.deleteCollection).toBeCalled();
        expect(onDeleteProtocol(event, {})).toBe([]);


    });
});

Модуль

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const {lastModifiedNeedsUpdate} = require("../utilities/event");

function deleteCollection(db, collectionPath, batchSize) {
    return deleteQueryBatch(db, db.collection(collectionPath).orderBy('__name__').limit(batchSize), batchSize, []);
}

...

const deleteProtocol = () => functions.firestore
    .document('protocols/{protocolId}')
    .onDelete((event, context) => {
        return deleteCollection(admin.firestore(), `protocols/${event.id}/trails`, 1);
    });


module.exports = {
    deleteProtocol,
    createProtocol,
    updateProtocol,
    deleteCollection,
};

- Frode

1 Ответ

1 голос
/ 20 октября 2019

Я решил эту проблему, переместив вспомогательные функции (deleteCollection и deleteQueryBatch) в собственный модуль и смоделировав этот модуль.

- Frode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...