Как я могу издеваться над библиотекой в ​​шутку? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь смоделировать библиотеку типов файлов в шутливом тесте.В моем файле javascript я использую эту библиотеку следующим образом:

import * as fileType from 'file-type';

....
const uploadedFileType = fileType(intArray);

Затем, в моем тесте шутки, я делаю:

jest.mock('file-type');
import * as fileType from 'file-type';

и затем пытаюсь смоделироватьответ следующим образом:

fileType = jest.fn();
fileType.mockReturnValue({ ext: 'jpg' });

Однако я получаю сообщение об ошибке "fileType" is read-only.

У кого-нибудь есть идеи относительно того, что я делаю неправильно?Заранее спасибо.

Ответы [ 2 ]

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

В начале вашего шутного теста у вас есть: import * as fileType from 'file-type';

Эта строка создает (постоянную) переменную с именем fileType, которую нельзя переназначить .Это означает, что дальше, когда у вас есть fileType = jest.fn(), вы получите ошибку, которая "fileType" is read-only - потому что вы больше не можете назначить fileType чему-то другому.

Чтобы высмеивать fileType, вы можетевыполните следующее:

jest.mock('file-type')
import fileType from 'file-type'

const mockValue = { ext: 'jpg' }
fileType.mockImplementation(() => (mockValue))

const BUFFER = Buffer.from([0x00, 0x01])

describe('Mocks file-type', () => {
  it("should equal { ext: 'jpg' }", () => {
    expect(fileType(BUFFER)).toEqual(mockValue)
  })
})

В результате вы получите поддельный модуль fileType (который на самом деле является просто функцией), который, независимо от того, что ему передано, вернет { ext: 'jpg' }.

В отдельном примечании вы должны знать, что ваша строка import * as fileType from 'file-type' (как в вашем коде использования, так и в тестовом коде), вероятно, не то, что вы хотите.Это создает объект с именем fileType, который имеет функцию с именем default - это означает, что вам нужно использовать его следующим образом:

fileType.default(buffer)

Если вы хотите использовать file-type традиционным способом,Вы можете импортировать с помощью import fileType from 'file-type' - это даст вам функцию fileType(), которую вы ищете.

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

Если вам нужен только один и тот же тип возврата во всех тестах, вы можете смоделировать его следующим образом

jest.mock('fileType', ()=> () => ({
  ext: 'jpg'
}))

Это будет издеваться над модулем, поэтому fileType() всегда будет возвращать {ext: 'jpg'}.

Если вам нужны разные возвращаемые значения во время теста, вам нужно смоделировать модуль, чтобы он возвратил шпиона, где вы можете установить результат симуляции позже в тесте, используя mockImplementation:

import fileType from 'fileType'
jest.mock('fileType', ()=> jest.fn())

fileType.mockImplementation(() => ({
  ext: 'jpg'
}))
...