Javascript Поддельный Mocha / Sinon XMLHttpRequest для возврата объекта в середине тестируемого метода - PullRequest
0 голосов
/ 24 марта 2020

Здравствуйте, я новичок в использовании mocha / sinon, и у меня возникла эта проблема

Я тестирую этот метод

export async function onConfigEvent(event: configEvent, otherConfig: otherConfig) {
  var myConfig = event.config as Config;

  const info = await fetchInfo(otherConfig.detailsPath, myConfig.Id);

  if (!isDefined(info)) {
    console.log('info is undefined.');
    return;
  }
}

этот метод на самом деле намного больше, с множеством операторов if поэтому я хочу проверить каждый путь этого. у меня проблема с вызовом fetchInfo(). эта функция вызывает функцию, которая создает URL-адрес и т. д., а затем вызывает другую функцию, которая выполняет фактический вызов с обещанием. что мне нужно, это подделать fetchInfo и заставить его вернуть то, что я хочу для этого экземпляра, я хочу, чтобы он return undefined, поэтому он входит в if, а в других случаях я хочу, чтобы он возвращал фальшивую модель, как будто она удалось. но я понятия не имею, как это сделать, и я долго искал и начал пытаться с sinon.stub, но как бы мне реализовать это здесь?

так выглядит мой тест

it('should log info undefined', () => {

let event: configEvent = {
  type: events.Config,
  config: { ["Id"]: 361 }
}

let fetch = sinon.stub(fetchResource);

let otherConfig = getOtherConfig();

let spy = sinon.spy(console, 'log');

onConfigEvent(event, otherConfig)

assert(spy.calledWith('info is undefined.'));

spy.restore();

});

где fetchResource - функция, вызываемая fetchInfo, но это ничего не делает

1 Ответ

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

Вам нужно заглушить fetchInfo функцию. sinon. js напрямую не поддерживает функцию-заглушку. Необходимо использовать rewire пакет.

Например,

index.ts:

function isDefined(obj) {
  return typeof obj !== 'undefined';
}

export async function fetchInfo(url, id) {
  //
}

export async function onConfigEvent(event, otherConfig) {
  const myConfig = event.config;

  const info = await fetchInfo(otherConfig.detailsPath, myConfig.Id);

  if (!isDefined(info)) {
    console.log('info is undefined.');
    return;
  }
}

index.test.ts:

import rewire from 'rewire';
import sinon from 'sinon';

describe('60828989', () => {
  afterEach(() => {
    sinon.restore();
  });
  it('should print log if info is undefined', async () => {
    const mod = rewire('./');
    const fetchInfoStub = sinon.stub().resolves();
    const logSpy = sinon.spy(console, 'log');
    mod.__set__('fetchInfo', fetchInfoStub);
    const event = { config: { id: 1 } };
    const otherConfig = { detailsPath: 'http:/localhost' };
    await mod.onConfigEvent(event, otherConfig);
    sinon.assert.calledWithExactly(logSpy, 'info is undefined.');
  });
  it('should do nothing if info is defined', async () => {
    const mod = rewire('./');
    const fetchInfoStub = sinon.stub().resolves({});
    const logSpy = sinon.spy(console, 'log');
    mod.__set__('fetchInfo', fetchInfoStub);
    const event = { config: { id: 1 } };
    const otherConfig = { detailsPath: 'http:/localhost' };
    await mod.onConfigEvent(event, otherConfig);
    sinon.assert.notCalled(logSpy);
  });
});

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

  60828989
info is undefined.
    ✓ should print log if info is undefined (124ms)
    ✓ should do nothing if info is defined


  2 passing (150ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |   66.67 |     100 |                   
 index.ts |     100 |      100 |   66.67 |     100 |                   
----------|---------|----------|---------|---------|-------------------

исходный код: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60828989

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