Как смоделировать создание объекта и его метод - PullRequest
0 голосов
/ 13 февраля 2020
new UrlBuilder(urlString).buildURL(params).getShortenedURL().then(data => {
  .....
});

Как можно заблокировать создание объекта и проверить, был ли вызван getShortenedURL()?

Я пытался

this.urlBuilder = sinon.stub(UrlBuilder.prototype, getShortenedURL).resolves({url: '/someUrl'});

Но каждый раз, когда я запускаю тест, который имеет:

assert(this.urlBuilder.getShortenedURL.called);

это скажет

ReferenceError: getShortenedURL is not defined

1 Ответ

0 голосов
/ 14 февраля 2020

Вот решение для модульного тестирования:

index.js:

const UrlBuilder = require('./urlBuilder');

function main() {
  const urlString = 'https://stackoverflow.com/';
  const params = {};
  return new UrlBuilder(urlString)
    .buildURL(params)
    .getShortenedURL()
    .then((data) => data);
}

module.exports = main;

urlBuilder.js:

class UrlBuilder {
  constructor(url) {
    this.url = url;
  }
  buildURL(params) {
    return this;
  }
  getShortenedURL() {
    return Promise.resolve('real data');
  }
}

module.exports = UrlBuilder;

index.test.js:

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

describe('60214679', () => {
  it('should pass', async () => {
    const urlBuilderInstanceStub = {
      buildURL: sinon.stub().returnsThis(),
      getShortenedURL: sinon.stub().resolves('fake data'),
    };
    const urlBuilderStub = sinon.stub().callsFake(() => urlBuilderInstanceStub);
    const main = proxyquire('./', {
      './urlBuilder': urlBuilderStub,
    });
    const actual = await main();
    expect(actual).to.be.eq('fake data');
    sinon.assert.calledWithExactly(urlBuilderStub, 'https://stackoverflow.com/');
    sinon.assert.calledWithExactly(urlBuilderInstanceStub.buildURL, {});
    sinon.assert.calledOnce(urlBuilderInstanceStub.getShortenedURL);
  });
});

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

60214679
    ✓ should pass (2010ms)


  1 passing (2s)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |      70 |      100 |      40 |      70 |                   
 index.js      |     100 |      100 |     100 |     100 |                   
 urlBuilder.js |      25 |      100 |       0 |      25 | 3,6,9             
---------------|---------|----------|---------|---------|-------------------

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

...