Могу ли я заглушить функцию, которая на три уровня глубже от функции, которую я тестирую - PullRequest
0 голосов
/ 26 марта 2020

У меня есть этот сценарий, и я пытаюсь написать для него unitTest

    const processAllItems = (listOfItems) => {
      //some processing and then
      let itemListProcessed = [];
      let itemProcessed;
      listOfItems.forEach(item => {
        itemProcessed = processItem(item)
        itemListProcessed.push(itemProcessed);
      })
      return itemListProcessed;
    }


    const processItem = (item) => {
      //Do some processing and then
      let validItem = isItemValid(item);
      if(validItem) {
        // do some processing
      } 
      else {
        //do something else
      }
    }


    const isItemValid = (item) => {
      if(item)  return true
      else  return false
      }
    }

Я пишу для него модульные тесты. Я хочу проверить метод высокого уровня (processAllItems ()). Внутри этого метода вызывается processItem (), а внутри метода processItem () - другой метод isItemValid (). Как я могу заглушить метод isValidItem (), чтобы всегда возвращать true, не заглушая метод processItem (). Я попробовал это, но это не сработало:

        sandbox.stub(mainService, 'isItemValid').callsFake(() => {
        console.log("stub is triggered")
        return true;
    });

Заранее спасибо, любая помощь будет оценена. Я использую mocha / sinon

, и мой код выглядит так:

// Inside this file are all three methods described on the post
const mainService = require('pathToFile'); 
describe.only('Check processAllItems', async function() {
    let sandbox;
    before(async function() {
        sandbox = sinon.createSandbox();
    })

    after(async function () {
        sandbox.restore();
    })

    it.only('should process sale', async function() {
        sandbox.stub(mainService, 'isValidItem').callsFake(() => {
            return false;
        });

        let resutls = await mainService.processAllItems(record);
    })   
})

1 Ответ

0 голосов
/ 03 апреля 2020

Я использую rewire модуль пакета, чтобы заглушить isItemValid функцию. Например,

index.js:

const processAllItems = (listOfItems) => {
  let itemListProcessed = [];
  let itemProcessed;
  listOfItems.forEach((item) => {
    itemProcessed = processItem(item);
    itemListProcessed.push(itemProcessed);
  });
  return itemListProcessed;
};

const processItem = (item) => {
  let validItem = isItemValid(item);
  if (validItem) {
  } else {
  }
  return validItem;
};

const isItemValid = (item) => {
  if (item) return true;
  return false;
};

module.exports = { processAllItems };

index.test.js:

const rewire = require('rewire');
const sinon = require('sinon');
const { expect } = require('chai');

describe('Check processAllItems', () => {
  it('should pass', () => {
    const mod = rewire('./');
    const isItemValidStub = sinon.stub().returns(true);
    mod.__set__('isItemValid', isItemValidStub);
    const listOfItems = [0, 1];
    const actual = mod.processAllItems(listOfItems);
    expect(actual).to.be.eql([true, true]);
    sinon.assert.calledWithExactly(isItemValidStub.firstCall, 0);
    sinon.assert.calledWithExactly(isItemValidStub.secondCall, 1);
  });
});

результаты модульного теста с отчетом о покрытии:

  Check processAllItems
    ✓ should pass (696ms)


  1 passing (704ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |      80 |       25 |      75 |   85.71 |                   
 index.js |      80 |       25 |      75 |   85.71 | 20,21             
----------|---------|----------|---------|---------|-------------------

источник код: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60857745

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...