Как протестировать каждый метод услуги отдельно? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть сервис, который вызывает API. Я уже создал тест, который проверяет общую парадигму сервиса, но мне нужно проверить метод по методу внутри сервиса.

Это сервис:

import ApiClient from './apiClient';
import ApiNormalizer from './apiNormalizer';
import Article from '../models/Article.model';
import { ContentWithFacet } from '../types/contentWithFacets';
import EventModel from '../models/Event.model';

export interface ResponseData {
  [key: string]: any;
}

export default class ApiService {
  static makeApiCall = <T>(
    url: string,
    normalizeCallback: <T>(d: ResponseData) => T | any,
    callback: (d: T) => any
  ): Promise<void> =>
    ApiClient.get(url)
      .then(res => {
        callback(normalizeCallback(res.data));
      })
      .catch(error => {
        console.error(`ApiClient ${url}`, error);
      });

  static getHomeArticles = (
    callback: (a: ResponseData) => void,
    limit: string,
    sort: string
  ): Promise<void> =>
    ApiService.makeApiCall<Article[]>(
      `content?type=article&limit=${limit}&sort=${sort}`,
      ApiNormalizer.normalizeArticles,
      callback
    );

  static getEvents = (
    callback: (a: EventModel[]) => void,
    pageCount?: number,
    limit?: number,
    sort?: string
  ): Promise<void> =>
    ApiService.makeApiCall(
      `content?type=event&page=${pageCount}&limit=${limit}&sort=${sort}`,
      ApiNormalizer.normalizeEvents,
      callback
    );
}

И это мой тест:

import ApiClient from './apiClient';
import ApiService from './apiService';

const mockData = {};
const mockError = { message: 'Smth Bad Happened' };

jest.mock('./apiClient', () => {
  return {
    get: jest.fn()
  };
});

const firstCallback = jest.fn((data: any) => data);
const secondCallback = jest.fn((data: any) => data);

describe('apiService', () => {
  beforeAll(() => {
    // @ts-ignore
    ApiClient.get.mockImplementation((url: string) => {
      return Promise.resolve({ data: mockData });
    });
  });

  it('should call api client method', () => {
    ApiService.makeApiCall('testUrl', data => data, res => res);
    expect(ApiClient.get).toBeCalledTimes(1);
    expect(ApiClient.get).toBeCalledWith('testUrl');
  });

  it('should call callbacks consequently', done => {
    ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(
      () => {
        expect(firstCallback).toBeCalledTimes(1);
        expect(firstCallback).toBeCalledWith(mockData);
        expect(secondCallback).toBeCalledTimes(1);
        expect(secondCallback).toBeCalledWith(firstCallback(mockData));
        done();
      }
    );
  });
});

describe('api service error flow', () => {
  beforeAll(() => {
    // @ts-ignore
    ApiClient.get.mockImplementation((url: string) => {
      console.log('error result');
      return Promise.reject(mockError);
    });
  });

  it('should handle error', done => {
    console.error = jest.fn();

    const firstCallback = jest.fn((data: any) => {
      return data;
    });
    const secondCallback = jest.fn((data: any) => {
      return data;
    });
    ApiService.makeApiCall('test url', firstCallback, secondCallback).then(
      () => {
        expect(firstCallback).toBeCalledTimes(0);
        expect(secondCallback).toBeCalledTimes(0);
        expect(console.error).toBeCalledTimes(1);
        expect(console.error).toBeCalledWith('ApiClient test url', mockError);
        done();
      }
    );
  });
});

Как вы могли видеть выше, я тестирую только метод ApiService.makeApiCall, но я бы хотел протестировать getHomeArticles и getEvents методы.

Любые идеи о том, какиздеваться над этими методами, чтобы завершить мои тесты?

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