Как я могу издеваться над функцией модуля стороннего узла, используя Jest с машинописью? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь смоделировать функцию в стороннем модуле узла, в частности функцию fs.readFileSync (), используя jest. Есть немало примеров, но я не нашел ни одного, который бы использовал Typescript. У меня есть простой, надеюсь, минимальный пример на github . Вероятно, это простая проблема для тех, кто знаком с шуткой.

1 Ответ

0 голосов
/ 31 августа 2018

Вот несколько разных способов издеваться над чем-то вроде fs.readFileSync():

Макет функции

Чтобы смоделировать функцию, используйте jest.spyOn() в сочетании с такими функциями, как mockImplementation():

import { returnNameInJsonFile } from './index';
import * as fs from 'fs';

describe('index', () => {

  it('returnNameInJsonFile', () => {
    const mock = jest.spyOn(fs, 'readFileSync');  // spy on fs.readFileSync()
    mock.mockImplementation(() => JSON.stringify({ name: 'myname' }));  // replace the implementation

    const name: string = returnNameInJsonFile('test.json');
    expect(name).toBe('myname');

    mock.mockRestore();  // restore fs.readFileSync()
  });

});

Макет модуля с использованием фабрики

Передайте модуль фабрики на jest.mock():

import { returnNameInJsonFile } from './index';

jest.mock('fs', () => {
  const MOCK_FILE_INFO = { 'test.json': JSON.stringify({ name: 'myname' }) };
  return {
    readFileSync: (fpath, opts) => {
      if (fpath in MOCK_FILE_INFO) {
        return MOCK_FILE_INFO[fpath]
      }
      throw 'unexpected fpath'
    }
  }
});

describe('index', () => {
  it('returnNameInJsonFile', () => {
    const name: string = returnNameInJsonFile('test.json');
    expect(name).toBe('myname'); // 1.0.0 is installed and 2.0.0 is available
  });
});

Автоматическая проверка модуля

Создание макета для модуля .

Jest будет использовать макет автоматически, если только он не является базовым Node-модулем (например, fs), в этом случае вызов jest.mock() требуется .

__ издевается __ / fs.ts:

const fs = jest.genMockFromModule('fs');

let mockFiles: object = {};

function __setMockFiles (newMockFiles: object) {
  mockFiles = newMockFiles;
}

function readFileSync(filePath: string) {
  return mockFiles[filePath] || '';
}

// If anyone knows how to avoid the type assertion feel free to edit this answer
(fs as any).__setMockFiles = __setMockFiles;
(fs as any).readFileSync = readFileSync;

module.exports = fs;

index.test.ts:

import { returnNameInJsonFile } from './index';

jest.mock('fs');  // Required since fs is a core Node module

describe('index', () => {

  const MOCK_FILE_INFO = { 'test.json': JSON.stringify({ name: 'myname' }) };

  beforeEach(() => {
    require('fs').__setMockFiles(MOCK_FILE_INFO);
  });

  it('returnNameInJsonFile', () => {
    const name: string = returnNameInJsonFile('test.json');
    expect(name).toBe('myname'); // 1.0.0 is installed and 2.0.0 is available
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...