Как правильно протестировать функцию загрузки файлов клиента API? - PullRequest
0 голосов
/ 09 ноября 2018

Я использую пользовательскую оболочку клиента API вокруг Axios в своем приложении React, и я совершенно не понимаю, как проверить функцию, используемую для правильной загрузки файлов. У меня нет проблем с тестированием методов get и post, но postForFile действительно поставил меня в тупик.

apiClient.js

import axios from 'axios';

const getData = response => response.data;

export default class apiClient {
  constructor(baseURL) {
    this.axios = axios.create({ baseURL });
  }

  get = (url, ...args) => this.axios.get(url, ...args).then(getData);

  post = (url, data) => this.axios.post(url, data).then(getData);

  postForFile = (url, data, mimeType, fileName) =>
    this.axios.post(url, data, { responseType: 'arraybuffer' }).then(response => {
      const a = document.createElement('a');
      mimeType = mimeType || 'application/octet-stream';

      if (navigator.msSaveBlob) {
        // IE10
        navigator.msSaveBlob(
          new Blob([response.data], {
            type: mimeType
          }),
          fileName
        );
      } else if (URL && 'download' in a) {
        // html5 A[download]
        a.href = URL.createObjectURL(
          new Blob([response.data], {
            type: mimeType
          })
        );
        a.setAttribute('download', fileName);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      } else {
        // eslint-disable-next-line no-restricted-globals
        location.href = `data:application/octet-stream,${encodeURIComponent(response.data)}`;
      }
    });
}

apiClient.test.js

import ApiClient from '../apiClient';

describe('ApiClient', () => {
  const apiClient = new ApiClient('http://localhost:8080');

  it('calls GET mocked axios via ApiClient and returns data', () => {
    apiClient.get('common/AppData').then(result => {
      expect(result).toEqual('get completed');
    });
  });

  it('calls POST mocked axios via ApiClient and returns data', () => {
    apiClient.post('common/AppData', { test: true }).then(result => {
      expect(result).toEqual('post completed');
    });
  });

  it('calls POST (for file) mocked axios via ApiClient and returns data', () => {
    apiClient.postForFile('common/FileData', { test: true }, 'applicaton/pdf', 'TestFile.pdf').then(result => {
      // ?
    });
  })
});

И, наконец, мой макет файла:

axios.js

export default {
  create: jest.fn(() => ({
    get: jest.fn(() => Promise.resolve({ data: 'get completed' })),
    post: jest.fn(() => Promise.resolve({ data: 'post completed' }))
  }))
};

Буду признателен за любые идеи.

Спасибо!

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