Тестирование функций со свойствами с использованием Jest и Sinon - PullRequest
1 голос
/ 18 февраля 2020

я пытаюсь написать тесты для тестирования потоков в моем приложении, имея дело с библиотекой fs с ее функцией createWriteStream, поэтому созданная мной заглушка выглядит следующим образом:

writeStreamStub = sinon.stub()
onceStreamEventStub = sinon.stub()
endStreamStub = sinon.stub()
onStreamStub = sinon.stub()

createStreamStub = sinon.stub(fs, 'createWriteStream').returns({
  write: writeStreamStub,
  once: onceStreamEventStub,
  end: endStreamStub,
  on: onStreamStub
})

Так что теперь я могу проверить, не вызваны ли функции и не вызваны ли возвращенные функции. Но я использую флаг --coverage, и код обратных вызовов возвращаемых функций не рассматривается, метод write вызывается внутри process.nextTick, и я понятия не имею, как go узнать об этом. Можно ли охватить весь код и код внутри обратных вызовов, и если да, то как мне go об этом. Заранее спасибо.

NB Переменные объявлены глобально

1 Ответ

1 голос
/ 18 февраля 2020

Если нет убедительной причины использовать как sinon, так и jest, я бы рекомендовал использовать только одну библиотеку. Если вы решили go с шуткой, вот простой пример. Предположим, у вас есть класс, подобный

const fs = require('fs');

module.exports = class FileWriter {
  constructor() {
    this.writer = fs.createWriteStream('./testfile.txt');
  }

  writeFile() {
    process.nextTick(() => {
      this.writeContent('hello world');
    });
  }

  writeContent(content) {
    this.writer.write(content);
    this.writer.end();
  }

};

, и в своем модульном тесте вы хотите смоделировать поведение всех используемых функций fs (в данном случае createWriteStream, writer, end) и просто проверить, являются ли они вызывается с правильными аргументами. Вы можете сделать это примерно так:

const fs = require('fs');
const FileWriter = require('./FileWriter');
// use this to have mocks for all of fs' functions (you could use jest.fn() instead as well)
jest.mock('fs');
describe('FileWriter', () => {
  it('should write file with correct args', async () => {
    const writeStub = jest.fn().mockReturnValue(true);
    const endStub = jest.fn().mockReturnValue(true);
    const writeStreamStub = fs.createWriteStream.mockReturnValue({
      write: writeStub,
      end: endStub,
    });

    const fileWriter = new FileWriter();
    fileWriter.writeFile();
    await waitForNextTick();
    expect(writeStreamStub).toBeCalledWith('./testfile.txt');
    expect(writeStub).toBeCalledWith('hello world');
    expect(endStub).toHaveBeenCalled();
  });
});

function waitForNextTick() {
  return new Promise(resolve => process.nextTick(resolve));
}
...