При тестировании компонента React есть ли способ напрямую вызвать его методы, не относящиеся к жизненному циклу?

Я использую Jest, и у меня есть такой компонент, как:

var TestClass = react.createClass({
  foo: function() {
    return "test";
  },
  render: function() {
    return <div />;
  }
});

И я хочу написать модульный тест специально для метода TestClass' foo.

Я видел, что вызов метода компонента React извне предполагает, что это должно быть возможно - просто визуализируйте компонент в тесте и вызовите его:

describe("TestClass", function() { 
    it("should access internal methods", function() { 
    var test = <TestClass />

    expect(test.foo()).toBeTruthy()
  }
});

Из ответа на этот вопрос я ожидаю, что этот тест пройдет, но вместо этого:

test.foo не является функцией

Я неправильно понял этот ответ?

В общем, я бы предпочел иметь возможность тестировать методы, не связанные с жизненным циклом, таким образом - это дало бы лучшую детализацию, но если это невозможно, есть ли разумная альтернатива?

Например, как можно протестировать метод, переданный в качестве реквизита дочернему компоненту, без этой возможности?


person ttrmw    schedule 30.03.2016    source источник
comment
Я предполагаю, что переменная test в вашем тесте не является экземпляром класса, а просто отображаемым компонентом (или чем-то еще, что возвращает .renderIntoDocument).   -  person Christian Gill    schedule 30.03.2016
comment
Вот что я получаю за создание надуманного примера переполнения стека! Будет редактировать   -  person ttrmw    schedule 30.03.2016


Ответы (2)


Используйте 1_:

import ReactTestUtils from 'react-addons-test-utils';

...

const test = ReactTestUtils.renderIntoDocument(
  <TestClass />
);
expect(test.foo()).toBeTruthy();
person Anuj    schedule 03.04.2016
comment
документ не определен... Это будет работать только в браузере. :\ - person Kyle Baker; 27.08.2016
comment
Правильно - мы все-таки используем renderIntoDocument из ReactTestUtils :) - person Anuj; 27.08.2016

Если вы используете фермент вместо ReactTestUtils, и вы используете средство визуализации монтирования фермента, вы можете вызвать .instance() в ReactWrapper для получения ReactComponent.

var test = mount(
  <TestClass />
);

expect(test.instance().foo()).toBeTruthy();
person Zachary Ryan Smith    schedule 17.11.2016