Запретить глобальную инициализацию Vue для модульных тестов - PullRequest
0 голосов
/ 18 марта 2019

Несколько недель назад я начал работать с Vue.js, и пока все идет хорошо. Поскольку мое приложение растет, я только начал писать юнит-тесты с помощью jest.

И вот тут-то и начинает думать ... скажем так ... хитро.

Прежде чем я объясню свою настоящую проблему, еще немного информации об установке Как я уже сказал, приложение сделано с Vue.js (инициализируется через Vue-Cli 3). Кроме того, используйте Vuex в качестве локального магазина и FireStore от Google в качестве постоянного магазина.

Моя структура папок выглядит следующим образом (обрезанные несвязанные вещи)

...
src
    ...
    components
        ...
    provider
        firebase
            ...
            project
    store
        modules
            ...
            project
                state
                getters
                mutations
                actions
    view
        ...
tests
    unit
        provider
            firebase
                project
...

Маленькое объяснение: В магазине у меня есть модули для различных объектов данных, которые я обрабатываю в приложении. В провайдере у меня есть все определенные методы, которые были вызваны из действий магазина, и эти методы фактически взаимодействуют с firebase.

Теперь я написал тест для src \ provider \ project.

// Mocking user object from store
jest.mock('@/store/modules/user/state',() => {
    return { currentUser: {uuid: 'MOCK_UUID'} };
});

// Mocking firebase object
jest.mock('firebase', () => {
    return {
        initializeApp: () => {
            return {
                storage: jest.fn(),
                firestore: () => {
                    return {
                        FieldValue: {
                            serverTimestamp: jest.fn(() => { return "MOCK_OBJECT_TIME"; })
                        },
                        settings: jest.fn(),
                        enablePersistence: jest.fn(() => { return Promise.reject('Mock'); })
                    };
                }
            };
        }
    };
});

import ProjectProvider from "@/provider/firebase/project";

describe('Prepare Payload for creation', () => {
    test('Set timestamp and owner', () => {
        let dummyProject = {};
        dummyProject = ProjectProvider.prepareCreatePayload(dummyProject);

        expect(dummyProject.createdAt).toBe("MOCK_OBJECT_TIME");
        expect(dummyProject.owner).toBe("MOCK_UUID");
    });
});

Сам тест работает и работает нормально.

Теперь к моей проблеме. Когда я включаю покрытие для тестов, я вижу, что есть также несколько компонентов, и другие вещи уже покрыты, фактически не написав тесты для них. Также выполнение теста занимает до 7 секунд. (Только для вышеупомянутого теста; если я добавлю еще один простой тест, продолжительность будет почти вдвое больше)

Это указывает на то, что из-за инициализации всего приложения vue загружается гораздо больше, чем нужно для теста.

Мой вопрос сейчас: Можно ли смоделировать глобальный класс Vue, чтобы предотвратить загрузку всего материала, чтобы тест загружал только то, что нужно? Или мой подход к проверке того, что взаимодействие с firebase работает как задумано, неправильный?

Спасибо за ваше внимание и возможные решения. Если вам понадобится дополнительная информация, чтобы помочь мне решить проблему, я постараюсь предоставить ее как можно быстрее.

Привет

...