Заглушка Sinon записывает только реагирующие вызовы, если она уже была запущена - PullRequest
0 голосов
/ 17 января 2019

Вот мой код, который я тестирую:

const CardWarsComponent = props => {
    const onSubmitCardMove = () => {
        props.floopThePig()
    }
    return <Button id="FloopButtonId" onClick={onSubmitCardMove}>FLOOP IT</Button>
};

Когда я тестирую, я делаю это:

const floopStub = sinon.stub();
const wrapper = shallow(<CardWarsComponent floopThePig={floopStub}></CardWarsComponent>)
const button = wrapper.find('#FloopButtonId').dive();
const onClick = button.prop('onClick');
onClick();
wrapper.update();
expect(floopStub).to.have.been.calledOnce();

Я обнаружил, что получил ответ:

TypeError: (0, _chai.expect)(...).to.have.been.calledOnce is not a function

НО, если я позвоню уже один раз:

const floopStub = sinon.stub();
floopStub()
const wrapper = shallow(<CardWarsComponent floopThePig={floopMock}></CardWarsComponent>)

Тогда я получаю:

 expected floopThePig to have been called exactly once, but was called twice
floopThePig at Context.floopThePig
floopThePig at floopThePig

Так почему я не могу вызвать его один раз, но после его вызова ... я получаю второй (реальный тест) вызов?

1 Ответ

0 голосов
/ 19 января 2019

Исходное сообщение об ошибке, которое вы получили, совершенно правильное - глядя на документы Sinon , .calledOnce - это не функция, это javascript get, который выполняет код. В общем, ожидания Чая кажутся функциями, только если им нужны параметры.

Я нахожу это немного раздражающим, потому что get перегрузка не очень приятна и лишает нас возможности рассуждать о коде, и это вызывает кучу ошибок, но эй хо.

Изменение вашего ожидания на

expect(floopStub).to.have.been.calledOnce;

исправляет тест (по крайней мере, на моей машине!)

Причина, по которой код кажется "работающим" во втором примере, заключается в том, что тест разрешает операцию calledOnce get, которая проверяет условие и выбрасывает утверждение о сбое теста, поэтому никогда не возникает вероятность выбросить исходную ошибку пытаясь вызвать get результат, как если бы это была функция.

Между прочим, легче вызвать событие щелчка с помощью встроенного в энзим .simulate() вызова. Этот код отлично работает:

const floopStub = sinon.stub();
const wrapper = shallow(<CardWarsComponent floopThePig={floopMock}></CardWarsComponent>);
wrapper.find('#FloopButtonId').dive().simulate('click');
expect(floopStub).to.have.been.calledOnce;

Подробнее о тестировании событий реакции с синоном / ферментом можно найти здесь: https://www.leighhalliday.com/testing-react-jest-enzyme-sinon

...