не может издеваться над переменной во время тестирования - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь протестировать node js Я хочу имитировать переменную вне функции, которая будет тестироваться модулем. например,

const sample = [];
function uploadDoc {
sample.push('fileLocation')
}
function toSave(){
for (i=0;i<sample.length;i++)
**some process read and access doc
}

Я столкнулся с проблемой при модульном тестировании второй функции, которую я пробовал перепрограммировать npm, которая также не работает

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

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

Изменения, которые я сделал для рефакторинга:

  1. функция uploadDo c теперь будет выводить массив.
  2. функция toSave теперь потребует 1 параметр, который является массивом.
  3. объединить функции в класс.
const sinon = require('sinon');
const { expect } = require('chai');

const Doc = {
  /**
   * @return array of file location.
   */
  uploadDoc: () => {
    const sample = [];
    sample.push('fileLocation');
    return sample;
  },

  /**
   * @param array samples
   * @return void
   */
  toSave: (samples) => {
    samples.forEach(() => {
      // Some process read and access doc.
    })
  },
}

/**
 * This is for example purposes.
 * @return void.
 */
function integrationBothFunction () {
  const samples = Doc.uploadDoc();
  Doc.toSave(samples);
}

describe('Unit Test', function () {
  it('uploadDoc fn', function () {
    const result = Doc.uploadDoc();
    // You expect the result to be an array.
    expect(result).to.be.an('array');
  });
  it('toSave fn', function () {
    const samples = [];
    const spySamples = sinon.spy(samples, 'forEach');
    // Call the function
    Doc.toSave(samples);
    // You expect: there is forEach called for samples.
    expect(spySamples.calledOnce).to.equal(true);
    // Do not forget to restore.
    spySamples.restore();
  });

  it('integrationBothFunction fn', function () {
    // This is just sample to check.
    const testSample = ['x'];
    // Now finally, you can stub uploadDoc.
    // Where real uploadDoc function not get called.
    const stubUploadDoc = sinon.stub(Doc, 'uploadDoc');
    stubUploadDoc.returns(testSample);

    // Spy on toSave fn.
    const spyToSave = sinon.spy(Doc, 'toSave');

    integrationBothFunction();

    // You expect that toSave is processing output from uploadDoc.
    expect(stubUploadDoc.calledOnce).to.equal(true);
    expect(spyToSave.calledOnce).to.equal(true);
    // Check argument toSave.
    const { args } = spyToSave;
    expect(args).to.have.lengthOf(1);
    expect(args[0]).to.have.lengthOf(1);
    expect(args[0][0]).to.include(testSample[0]);
    // Restore spy and stub.
    stubUploadDoc.restore();
    spyToSave.restore();
  });
});

Я использую мокко:

$ npx mocha stackoverflow.js 


  Unit Test
    ✓ uploadDoc fn
    ✓ toSave fn
    ✓ integrationBothFunction fn


  3 passing (13ms)
$ 

Надеюсь, это поможет. Удачи!

0 голосов
/ 29 мая 2020

Программирование нравится, что это сработает, вы должны сначала вызвать uploadDo c.

const sample = [];
    function uploadDoc {
    sample.push('fileLocation')
}
function toSave(){
    uploadDoc();
    for (var i=0;i<sample.length;i++)
    **some process read and access doc
}
...