Как смоделировать модуль, экспортирующий класс с переменными класса, используя jest - PullRequest
0 голосов
/ 25 июня 2018

У меня есть модуль, использующий react-native-sound следующими способами:

const Sound = require('react-native-sound');
...
const something = Sound.DOCUMENT;
const someOtherThing = new Sound();

Как мне издеваться над таким модулем?

1 Ответ

0 голосов
/ 06 июля 2018

Я смоделировал реакцию собственного звука с помощью ручного макета (в папке __mocks__), который выглядит следующим образом:

const isFakeFilename = filename => /^blah.*/.test(filename);

const mockFunctions = {
  play: jest.fn(cb => {
    console.log('*** Playing sound! ***');
    cb && cb(isFakeFilename(this.filename) ? false : true);
  }),
  setCategory: jest.fn(),
  getDuration: jest.fn(() => 100),
  getNumberOfChannels: jest.fn(() => 8)
};

const Sound = function(filename, blah2, cb) {
  this.play = mockFunctions.play.bind(this);
  this.filename = filename;
  const savedFilename = filename;
  setTimeout(() => {
    if (isFakeFilename(savedFilename)) {
      cb && cb(new Error('File does not exist! (mocked condition)'));
    } else {
      cb && cb();
    }
  });
};

Sound.prototype.play = mockFunctions.play.bind(Sound.prototype);
Sound.prototype.getDuration = mockFunctions.getDuration;
Sound.prototype.getNumberOfChannels = mockFunctions.getNumberOfChannels;

Sound.setCategory = mockFunctions.setCategory;

export default Sound;
export { mockFunctions };

Обратите внимание, как методы импорта звука добавляются напрямую (Sound.setCategory), а методы для экземпляров класса (play, getDuration и т. Д.) Добавляются с использованием прототипа.

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

import { mockFunctions } from 'react-native-sound';
// ...
expect(mockFunctions.play).toHaveBeenCalled();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...