Я пытаюсь смоделировать функцию из службы, но Jest продолжает вызывать реальную функцию вместо фиктивной функции - PullRequest
0 голосов
/ 21 февраля 2019

Я использую Jest для тестирования функции из сервиса, который использует axios для выполнения некоторых вызовов API.Проблема в том, что Jest продолжает вызывать реальную сервисную функцию вместо фиктивной сервисной функции.Вот весь код:

Тесты:

// __tests__/NotificationService.spec.js
const mockService = require('../NotificationService').default;

beforeEach(() => {
  jest.mock('../NotificationService');
});

describe('NotificationService.js', () => {
  it('returns the bell property', async () => {
    expect.assertions(1);
    const data = await mockService.fetchNotifications();
    console.log(data);
    expect(data).toHaveProperty('data.bell');
  });
});

Макет:

// __mocks__/NotificationService.js
const notifData = {
  bell: false,
  rollups: [
    {
      id: 'hidden',
      modifiedAt: 123,
      read: true,
      type: 'PLAYLIST_SUBSCRIBED',
      visited: false,
      muted: false,
      count: 3,
      user: {
        id: 'hidden',
        name: 'hidden'
      },
      reference: {
        id: 'hidden',
        title: 'hidden',
        url: ''
      }
    }
  ],
  system: [],
  total: 1
};

export default function fetchNotifications(isResolved) {
  return new Promise((resolve, reject) => {
    process.nextTick(() =>
      isResolved ? resolve(notifData) : reject({ error: 'It threw an error' })
    );
  });
}

Служба:

import axios from 'axios';

// hardcoded user guid
export const userId = 'hidden';

// axios instance with hardcoded url and auth header
export const instance = axios.create({
  baseURL: 'hidden',
  headers: {
    Authorization:
      'JWT ey'
  }
});

/**
 * Notification Service
 * Call these methods from the Notification Vuex Module
 */
export default class NotificationService {

  /**
   * @GET Gets a list of Notifications for a User
   * @returns {AxiosPromise<any>}
   * @param query
   */
  static async fetchNotifications(query) {
    try {
      const res = await instance.get(`/rollups/user/${userId}`, {
        query: query
      });
      return res;
    } catch (error) {
      console.error(error);
    }
  }
}

IЯ пробовал несколько вариантов использования require вместо импорта NotificationService, но он дал некоторые другие загадочные ошибки ...

Мне кажется, что я упускаю что-то простое.

Помогите мнепожалуйста:)

1 Ответ

0 голосов
/ 21 февраля 2019

Проблема в том, что Jest продолжает вызывать реальную сервисную функцию вместо фиктивной сервисной функции.

babel-jest поднимает jest.mock вызовы, чтобы они выполнялись раньше всего (дажеimport звонки), но подъем является локальным для блока кода , как описано в выпуске 2582 .

Я чувствую, что что-то упустилпросто.

Переместите ваш вызов jest.mock за пределы beforeEach, и он будет поднят на вершину всего вашего теста, поэтому ваш макет будет возвращен require:

const mockService = require('../NotificationService').default;  // mockService is your mock...

jest.mock('../NotificationService');  // ...because this runs first

describe('NotificationService.js', () => {
  it('returns the bell property', async () => {
    ...
  });
});
...