Как смоделировать экспортируемую функцию с помощью sinon. js? - PullRequest
0 голосов
/ 08 апреля 2020

Итак, у меня есть файл с именем article.js, который выглядит следующим образом:

import a from 'indefinite';

function formatArticle(value) {
  return a(value);
}

export { formatArticle };
export default formatArticle;

И файл с именем index.js, который выглядит следующим образом:

import formatArticle from './article';

const format = (value, incomingFormat) => {
  if (incomingFormat === 'indefinite') {
    return formatArticle(value);
  }

  return value;
};

export default format;

Я пытаюсь чтобы проверить, что функция formatArticle, которую я импортирую, вызывается, когда это необходимо. Я использую sinon и chai для этого. Вот файл теста:

import chai, { expect } from 'chai';
import sinon from 'sinon';
import sinonChai from 'sinon-chai';

import format from './index';
import * as article from './article';

chai.use(sinonChai);

describe('format', () => {
    describe('article', () => {
        describe(`when incoming format is 'indefinite'`, () => {
            const value = 'some value';
            const indefinite = 'indefinite';

            let formatArticleSpy;

            beforeEach(() => {
                formatArticleSpy = sinon.spy(article, 'formatArticle');
                format(value, indefinite);
            });

            it('should call formatArticle', () => {
                expect(formatArticleSpy).to.have.been.calledWith(value);
            });
        });
    });
});

Однако всякий раз, когда я запускаю набор тестов, он сообщает мне:

AssertionError: expected formatArticle to have been called with arguments some value

Что я делаю неправильно в этой настройке? Является ли использование шпиона правильным способом сделать это? Я также попытался использовать sinon.stub и получил тот же результат.

Любая помощь приветствуется!

1 Ответ

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

sinon. js Используйте Соединительные швы , чтобы отключить автономную функцию. Функция formatArticle для вашего случая.

Например:

article.js:

import a from './indefinite';

function formatArticle(value) {
  return a(value);
}

export default formatArticle;

indefinite.js:

export default function a(value) {
  return 'real data';
}

index.js:

import formatArticle from './article';

const format = (value, incomingFormat) => {
  if (incomingFormat === 'indefinite') {
    return formatArticle(value);
  }

  return value;
};

export default format;

index.test.js:

import proxyquire from 'proxyquire';
import sinon from 'sinon';

describe('61104001', () => {
  it('should pass', () => {
    const value = 'some value';
    const indefinite = 'indefinite';
    const formatArticleStub = sinon.stub().returns('fake data');
    const format = proxyquire('./', {
      './article': { default: formatArticleStub },
    }).default;
    const actual = format(value, indefinite);
    sinon.assert.match(actual, 'fake data');
    sinon.assert.calledWithExactly(formatArticleStub, value);
  });
  // you can do the rest
});

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

  61104001
    ✓ should pass (2259ms)


  1 passing (2s)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |   72.73 |       50 |   33.33 |   72.73 |                   
 article.ts    |   66.67 |      100 |       0 |   66.67 | 4                 
 indefinite.ts |      50 |      100 |       0 |      50 | 2                 
 index.ts      |   83.33 |       50 |     100 |   83.33 | 8                 
---------------|---------|----------|---------|---------|-------------------

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

...