Асинхронный тест Jest в хуке жизненного цикла vueJS с интервалом - PullRequest
0 голосов
/ 09 мая 2018

Я хотел бы понять, как я могу проверить свое действие "auth / refresh" в хуке "beforeCreate" с шуткой, как показано ниже:

// main.vue

async beforeCreate() {
    let authTokenRefreshIntervalId;

    await this.$store.dispatch('auth/initialize');

    authTokenRefreshIntervalId = setInterval(() => {
      this.$store.dispatch('auth/refresh').catch(() => {
        this.$store.dispatch('auth/logout');
        clearInterval(authTokenRefreshIntervalId);
      });
    }, 30 * 1000);
}

// main.spec.js

import Vue from 'vue';
import Vuex from 'vuex';
import { shallow, createLocalVue, mount } from '@vue/test-utils';
import Main from '@/main';

const localVue = createLocalVue();

jest.useFakeTimers();

describe('store-auth', () => {
  let store;
  let actions;
  let getters;

  beforeEach(() => {
    actions = {
      initialize: jest.fn(),
      refresh: jest.fn(),
      logout: jest.fn(),
    };

    getters = {
      isAuthenticated: jest.fn(),
    };

    store = new Vuex.Store({
      modules: {
        auth: {
          namespaced: true,
          actions,
          getters,
        },
      },
    });
  });

  it('dispatch initialize on beforeCreate hook', () => {
    const wrapper = shallow(Main, { store, localVue });
    expect(actions.initialize).toHaveBeenCalled();
  });

  it('dispatch refresh on beforeCreate hook every 30s', () => {
    const wrapper = shallow(Main, { store, localVue });
    jest.runTimersToTime(30 * 1000);
    expect(actions.refresh).toHaveBeenCalled();
  });
});

Шутки говорят, что смоделированная функция не вызывается. Я попытался с expect(setInterval).toHaveBeenCalled(), и он прошел тест. Где я не прав, плз?

1 Ответ

0 голосов
/ 09 мая 2018

Попробуйте также использовать async / await в своем тесте.

it('dispatch refresh on beforeCreate hook every 30s', async () => {
    const wrapper = shallow(Main, { store, localVue });
    jest.runTimersToTime(30 * 1000);
    await expect(actions.refresh).toHaveBeenCalled();
 });
...