Sinon не обновляет количество вызовов, когда функция, которая заглушена, вызывается через локальную переменную

#node.js #unit-testing #mocha.js #sinon

#node.js #модульное тестирование #mocha.js #sinon

Вопрос:

У меня есть эта функция writeToFile, которая либо добавляет, либо записывает в зависимости от аргумента добавления. appendFile И writeFile взяты из модулей fs, которые я пытаюсь добавить в свои модульные тесты. Проблема в приведенном ниже коде заключается в том , что во время тестирования, когда я создаю заглушки для fs.appendFile и fs.writeFile , количество вызовов не увеличивается, если я назначаю функции добавления и записи локальной переменной func . Если я просто вызову эти функции напрямую, добавив условное условие, тесты будут работать нормально, но будут лишними строками кода и уродливыми(по мнению некоторых людей).

Было бы неплохо, если бы кто-нибудь мог объяснить это sinon поведение с помощью функции, назначенной локальной переменной, и есть ли решение без изменения функции в utils.js

фрагмент кода из utils.js:

 export async function writeToFile(path, data, append) {  const func = append ? fs.appendFile : fs.writeFile;  return func(path, data, (err) =gt; {  if (err) { logger.error(err); }  }); }  

фрагмент кода из test.js:

 it('Write to file', async () =gt; {  const append = sinon.stub(fs, 'appendFile');  const write = sinon.stub(fs, 'writeFile');    await writeToFile('path', 'buffer', false);  expect(append.callCount).to.equal(0);  expect(write.callCount).to.equal(1);    await writeToFile('path', 'buffer', true);  expect(append.callCount).to.equal(1);  expect(write.callCount).to.equal(1); });  

введите описание изображения здесь

Комментарии:

1. Когда вы вызовете writeToFile('path', 'buffer', false); fs.writeFile метод , он будет вызван, так append.callCount должно быть 0 и write.callCount должно быть 1 . Когда вы вызываете writeToFile('path', 'buffer', true) , fs.appendFile метод будет вызван, поэтому append.callCount становится 1 и write.callCount остается неподвижным 1 . Проходит ли этот тестовый случай?

2. нет, тестовый случай не проходит. количество вызовов всегда равно нулю для обоих

3. Не могу его воспроизвести. Работает на меня. "sinon": "^8.1.1" Результат теста: 70283615 [Function: writeFile] [Function: appendFile] ✓ Write to file 1 passing (7ms)

4. Я включен "sinon": "^9.1.0" , и я получаю следующую ошибку. Я отредактировал свой ответ, чтобы добавить скриншот ошибки