Тестовое значение переменной внутри функции javascript — sinon/chai

У меня есть следующая функция в компоненте React:

parentFunction: function(items){
  let variableOfInterest = this.callThisFunction().toArray().filter((ele) => {
    if(obj[ele.get('id')]){
      return ele
    }
  }).map((ele) => ele.get('id'))

  this.setState({newState:variableOfInterest})
}

Я могу написать тест для вызова callThisFunction с помощью заглушек, но не смог выяснить, можно ли использовать sinon или chai для слежения за значением variableOfInterest. Я хотел бы написать тест, в котором я могу передать аргумент и использовать «ожидание» для проверки значения результата. На самом деле не имеет смысла возвращать значение в конце - и делать это только для теста кажется ненужным. Я также хотел бы иметь возможность проверить результат вызова toArray(), а также filter(), если это возможно. Спасибо за любое понимание!

Это мой тест на вызов callThisFunction():

it('should call callThisFunction() once', () => {   
  let callThisFunctionStub = sinon.stub(prototype, 'callThisFunction')
  let stub = callThisFunctionStub.callsFake(() => objectToReturn)
  prototype.callParentFunction(items)
  sinon.assert.calledOnce(stub)
})

person zero_cool    schedule 11.09.2017    source источник
comment
Если код, стоящий за variableOfInterest, не имеет побочных эффектов, это мертвый код, и его можно просто удалить. Переменная вообще нигде в коде не используется.   -  person marvinhagemeister    schedule 11.09.2017
comment
@marvinhagemeister Используется для установки состояния.   -  person zero_cool    schedule 11.09.2017
comment
ты прав, я пропустил это! Извините за путаницу   -  person marvinhagemeister    schedule 11.09.2017
comment
вы не можете проверить/подтвердить state напрямую? Или вам, возможно, придется подумать о заглушке setState, чтобы проверить, являются ли параметры, с которыми он вызывается, теми, которые вы ожидаете (или хотите утвердить).   -  person tyskr    schedule 11.09.2017


Ответы (1)


Я хотел бы написать тест, в котором я могу передать аргумент и использовать «ожидание» для проверки значения результата.

Вариант 1:

Вы можете просто использовать состояние, чтобы получить обновленное значение newState и сравнить его с ожидаемым значением.

Это можно сделать очень легко, используя библиотеку airbnb/enzyme для тестирования вашего компонента React. Enzyme также использует mocha и chai, так что синтаксис будет почти идентичен. Он также предоставляет шпионский и фиктивный API, если вы хотите их использовать, хотя в этом случае вам, вероятно, это не понадобится.

Вот пример API для получения .state() с помощью поверхностного рендеринга:

const wrapper = shallow(<MyComponent />);
expect(wrapper.state().foo).to.equal(10);
expect(wrapper.state('foo')).to.equal(10);

Таким образом, вам нужно написать тест для компонента, который имеет parentFunction, выполнить поверхностное монтирование этого компонента, смоделировать вызов parentFunction, затем получить state и проверить его значение.

Вариант 2:

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

person ryder    schedule 11.09.2017
comment
Не могли бы вы уточнить, как бы вы реализовали Вариант 1? - person zero_cool; 12.09.2017