Как выполнить модульное тестирование вложенной функции в узле js? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть функция, для которой я пишу модульный тест, но эта функция вызывает другую функцию, и там я не могу смоделировать / заглушить эту функцию.

например:

function getValue( param1, param2, callback){
    getData(param1, param3).then( response) => {
         return callback();
    }, (err) => {
         return callback();
    });
}

Так что я не знаю, как издеваться над getData() функцией.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Вот рабочий пример, который демонстрирует, что вы пытаетесь сделать:

lib.js

function getData(param1, param2) {
  return fetch('someUrl');  // <= something that returns a Promise
}

exports.getData = getData;

code.js

const lib = require('./lib');

export function getValue(param1, param2, callback) {
  return lib.getData(param1, param2).then(response => {
    callback(response);
  }).catch(err => {
    callback(err);
  });
}

exports.getValue = getValue;

code.test.js

const sinon = require('sinon');

const lib = require('./lib');
const { getValue } = require('./code');

describe('getValue', () => {
  it('should do something', async () => {
    const stub = sinon.stub(lib, 'getData');
    stub.resolves('mocked response');

    const callback = sinon.spy();
    await getValue('val1', 'val2', callback);

    sinon.assert.calledWithExactly(stub, 'val1', 'val2');  // Success!
    sinon.assert.calledWithExactly(callback, 'mocked response');  // Success!
  });
});

Обновление

OP добавил в комментарии, что они не могут использовать async / await и экспортируют функцию, используя module.exports = getData;.

В этом случае экспорт модуля является функцией, и весь модуль должен быть смоделирован с помощью чего-то вроде proxyquire.

Утверждения должны быть сделаны в then обратном вызове, и тест должен вернуть результирующее Promise, поэтому mocha знает, что ждать его разрешения.

Обновленный пример:

lib.js

function getData(param1, param2) {
  return fetch('someUrl');  // <= something that returns a Promise
}

module.exports = getData;

code.js

const getData = require('./lib');

function getValue(param1, param2, callback) {
  return getData(param1, param2).then(response => {
    callback(response);
  }).catch(err => {
    callback(err);
  });
}

module.exports = getValue;

code.test.js

const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('getValue', () => {
  it('should do something', () => {
    const stub = sinon.stub();
    stub.resolves('mocked response');

    const getValue = proxyquire('./code', { './lib': stub });

    const callback = sinon.spy();
    return getValue('val1', 'val2', callback).then(() => {
      sinon.assert.calledWithExactly(stub, 'val1', 'val2');  // Success!
      sinon.assert.calledWithExactly(callback, 'mocked response');  // Success!
    });
  });
});
0 голосов
/ 01 апреля 2019
function getValue( param1, param2, callback){
    getData(param1, param3).then( response) => {
         callback(response);
    });
}

getvalue(param1, param2, function(error, response)) {
   console.log(response)
}

Это может помочь вам.

...