Шинон Шпион для неклассных методов - PullRequest
1 голос
/ 22 апреля 2019

У меня есть файл javascript с кучей утилит в файле с именем utils.js

export const processListOfItems = (input): [] => {
  let listOfItems = [];
  for (var index = 0; index < rawPayload.length; ++index) {
    listOfItems.push(someFunction(item));
  }
  return listOfItems;
};

someFunction также определена в utils.js.

Для теста я хотел бы заглушить "someFunction", но у меня возникли проблемы с выяснением, как это сделать. Похоже, что sinon.spy () может быть методом, который я хочу, но похоже, что он требует объекта, которого у меня нет, так как это всего лишь файл утилит.

Мой идеальный тест будет выглядеть примерно так

describe('someFunction fails on an item', () => {
  it('returns the array with the rest of the items', () => {
    const items = ['hi', 'hello'];

    // I want to make it such that, when we go into the getListOfItems code, we return 42 whenever we call someFunction, rather than going into the logic itself.
    const someFunctionStub = sinon.stub(someFunction).returns(42);

    expect(getListOfItems(items)).toEqual([42, 42]);
  });
});

1 Ответ

0 голосов
/ 23 апреля 2019

sinon.stub заменяет свойство объекта ...

... и часто объект является модулем , а свойство является функцией, которую экспортирует модуль .

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


Невозможно заглушить someFunction в приведенном выше коде, поскольку processListOfItems не вызывает экспорт модуля из someFunction, он вызывает someFunction напрямую.

processListOfItems необходимо вызвать экспорт модуля из someFunction, чтобы иметь возможность заблокировать вызов.


Вот простой примерпродемонстрировать использование синтаксиса модуля Node.js:

util.js

exports.func1 = () => {
  return 'hello ' + exports.func2();  // <= use the module
}

exports.func2 = () => 'world';

util.test.js

const sinon = require('sinon');
const util = require('./util');

describe('func1', () => {
  it('should work', () => {
    const stub = sinon.stub(util, 'func2').returns('everyone');
    expect(util.func1()).toBe('hello everyone');  // Success!
  });
});

... и вотпростой пример использования синтаксиса модуля ES6:

util.js

import * as util from './util';  // <= import module into itself

export const func1 = () => {
  return 'hello ' + util.func2();  // <= use the module
}

export const func2 = () => 'world';

util.test.js

import * as sinon from 'sinon';
import * as util from './util';

describe('func1', () => {
  it('should work', () => {
    const stub = sinon.stub(util, 'func2').returns('everyone');
    expect(util.func1()).toBe('hello everyone');  // Success!
  });
});

Обратите внимание, что модули ES6 можно импортировать в себя, так как они "поддержка циклического депоendencies автоматически ".

...