react pass method how freecodecamp event component child reactjs redux react-bootstrap reactjs-testutils

reactjs - method - react pass function to child component



Testing Reaccionar componente onClick evento con múltiples acciones en él (1)

No se puede averiguar cómo probar la función onClick con múltiples acciones en ella.

onButtonClick = function(action){ this.props.otherAction(); action(); } ... <Button bsStyle="success" bsSize="small" onClick={onButtonClick.bind(this,someAction}> Something </Button>

Y la prueba que tengo actualmente es así.

const onButtonClick = function (action) { actions.otherAction(); action(); }; it(''Should include a button with multiple actions on onClick event.'', function () { const button = shallowTestUtils.findAllWithType(_component, Button); expect(button[0].props.onClick).to.equal(onButtonClick.bind(this, actions.someAction)); });

El resultado que obtengo es esto.

AssertionError: expected [Function] to equal [Function]


El problema es que cada llamada de Function.prototype.bind devuelve una nueva función. Entonces estas funciones no son iguales

function onClick() { } console.log(onClick.bind() === onClick.bind()) // prints false

Si desea verificar que el botón reciba su controlador de clics, puede activar un clic simulado y verificar el resultado de la acción. Además, puedes onClick función onClick to spy.

it(''should trigger handler on button click'', function () { // mock actual action _component.onClick = sinon.spy(); // find button and trigger click on it const button = shallowTestUtils.findAllWithType(_component, Button)[0]; ReactTestUtils.Simulate.click(findDOMNode(button)); expect(_component.onClick.called).to.be.ok(); });

UPD. Si desea probar su componente en la tienda, para asegurarse de que se envíen las acciones adecuadas, puede hacerlo de la siguiente manera.

Primero, crea tu tienda simulada

const mockStore = { dispatch: sinon.spy(), getState() { // here you can return some mock state } }

Luego pasa esta tienda a tu componente. (Supongo que su MyComponent está conectado a la tienda)

const component = TestUtils.createRenderer().render(<MyComponent store={mockStore}>) const button = shallowTestUtils.findAllWithType(component, Button)[0]; ReactTestUtils.Simulate.click(findDOMNode(button)); // here you can check that dispatch was called with all expected actions expect(mockStore.dispatch.calledWith({type: ''ACTION_TYPE''})).to.be.ok();

Consulte la documentación de Sinon para obtener más información sobre los controles espía.