Как издеваться над внутренней функцией в Синоне? - PullRequest
0 голосов
/ 14 сентября 2018

Предположим, у меня есть две функции, foo вызывается внутри bar. У меня есть приложение Meteor, поэтому я решил использовать пакет meteor mocha вместе с sinon и chai, а не jest

// foo.js

const foo = () => // call to a google maps api;
export default foo;


// bar.js

const bar = (x) => {
  foo();
  ...
};
export default bar;

Каков правильный подход насмешки foo в этом случае

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

import foo from 'path/to/foo.js'
import bar from 'path/to/bar.js'

describe('my test suite', function() {
  it('should pass the test', function() {
    foo = spy();
    bar(5);
    assert(foo.calledOnce);
  });
}); 

Следующий код работает, но правильно ли переопределять foo?

UPDATE

Кроме того, невозможно создать макет или заглушку таким образом, что заставляет меня думать, что Sinon не подходит для насмешливых автономных функций

1 Ответ

0 голосов
/ 17 сентября 2018

Sinon хорошо работает с автономными функциями JavaScript.

Вот пример того, как обернуть экспорт модуля по умолчанию в Sinon шпион:

import * as sinon from 'sinon';
import * as fooModule from 'path/to/foo.js'
import bar from 'path/to/bar.js'

describe('my test suite', function() {
  it('should pass the test', function() {
    const spy = sinon.spy(fooModule, 'default');  // wrap the function in a spy
    bar(5);
    assert(spy.calledOnce);  // SUCCESS
    spy.restore();  // restore the original function
  });
}); 

Вот пример того, как заменить экспорт модуля по умолчанию на Sinon заглушку:

import * as sinon from 'sinon';
import * as fooModule from 'path/to/foo.js'
import bar from 'path/to/bar.js'

describe('my test suite', function() {
  it('should pass the test', function() {
    const stub = sinon.stub(fooModule, 'default').returns('something else');  // stub the function
    bar(5);  // foo() returns 'something else' within bar(5)
    assert(stub.calledOnce);  // SUCCESS
    stub.restore();  // restore the original function
  });
});
...