шутка + фермент мелкий .simulate('change',[args]) не передает аргументы для работы

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

class OrderDish extends Component {
    static propTypes = {
        order: React.PropTypes.object.isRequired,
        addCommentToOrder: React.PropTypes.func,
    };

    handleCommentChange = (event) => {
        this.props.addCommentToOrder(event.target.value, this.props.order, false);
    };

    render() {
        const { order, canOrder } = this.props;
        return (
            <div className="Order-dish">
                        <TextField
                            className='Order-dish-comment'
                            ref="comment"
                            id={order.entry.type}
                            value={order.comment ? order.comment : ''}
                            onChange={this.handleCommentChange}
                            fullWidth
                            onKeyDown={this.handleKeyPress}
                            disabled={!canOrder}
                        />
            </div>
        )
    }

}

export default OrderDish;

Теперь я хочу проверить, что функция handleCommentChange вызывается с правильными аргументами, когда событие onChange срабатывает в TextField.

У меня есть отдельный тест для самого метода, который работает так, как ожидалось:

it('handleCommentChange should call addCommentToOrder passing event.target.value, this.props.order, false', () => {
    const mockKeyPressFN = jest.fn((input) => {return input});
    let orderDish = shallow(<OrderDish order={mockOrder} addCommentToOrder={mockKeyPressFN}/>);

    orderDish.instance().handleCommentChange({key: 'Enter', target: {value: 'mock'}});
    expect(mockKeyPressFN.mock.calls[0]).toContainEqual("mock", {"entry": {"name": "blah", "tag": "MAIN", "type": "bleh"}, "price": 5.44}, false);
  });

Теперь, когда я пытаюсь сделать то же самое с simulate (передайте макет объект, посмотрите, вызывается ли функция):

it('TextField should call handleCommentChange onChange', ()=> {
    const mockKeyPressFN = jest.fn();
    let orderDish = shallow(<OrderDish order={mockOrder} addCommentToOrder={mockKeyPressFN}/>);
    let textField = orderDish.find('TextField');
    let event = {key: 'Enter', target: {value: 'mock'}};

    textField.simulate('change',[event]);
    expect(mockKeyPressFN.mock.calls.length).toBe(1);
  });

Я получил:

Невозможно прочитать значение свойства undefined

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

Что я делаю не так?


person Miha Šušteršič    schedule 10.01.2017    source источник
comment
попробуйте textField.simulate('изменить', событие); и вставьте несколько журналов отладки, чтобы увидеть, где он терпит неудачу   -  person T Mitchell    schedule 10.01.2017
comment
Только что понял, работает без передачи аргументов в виде массива   -  person Miha Šušteršič    schedule 10.01.2017


Ответы (1)


Вам нужно избавиться от массива.

textField.simulate('change',[event]);

будет

textField.simulate('change',event);

Другой способ сделать это:

act(() => {
  orderDish.find('TextField').simulate('change', {key: 'Enter', target: {value: 'mock'}}, other_arguments_to_handleCommentChange);
  orderDish.update();
});
person technazi    schedule 03.12.2019