используя шутку и фермент, я пытаюсь проверить изменение состояния при вызове handleUploadClick() и, следовательно, запускает uploadFile().
handleUploadClick = () => {
if (this.props.onUploadClick) {
this.props.onUploadClick();
}
this.uploadFile(this.state.selectedFile, this.state.apiFieldName, (progress) => {
this.setState({ uploadProgress: progress, buttonState: '', errorMessage: '' });
});
};
uploadFile(file, apiFieldName, progressCallback) {
if (file) {
const xhr = new XMLHttpRequest();
const formData = new FormData();
const fileItem = {};
fileItem[apiFieldName] = file;
xhr.responseType = 'json';
formData.append(apiFieldName, fileItem[apiFieldName]);
xhr.onload = () => {
const returnObj = xhr.response;
if (xhr.status === 500) {
this.setState({ errorMessage: 'There was a problem processing the upload. ' +
'Please select a different file' });
this.setState({ buttonState: 'error' });
} else if (xhr.status === 400) {
this.setState({ errorMessage: 'There was a problem uploading the file to the server' });
this.setState({ buttonState: 'error' });
} else {
this.props.onCompletedUpload(returnObj);
progressCallback(100);
}
};
xhr.upload.onprogress = (e) => {
if (e.lengthComputable) {
progressCallback(Math.round(((e.loaded / e.total)) * 100));
}
};
xhr.open(this.props.method, this.props.url, true);
xhr.setRequestHeader('Authorization', `JWT ${this.props.token}`);
xhr.send(formData);
this.xhrs[file.index] = xhr;
}
}
До сих пор мне удавалось использовать экземпляр моего компонента ( wrapper.instance() ), чтобы следить за uploadFile.
const instance = wrapper.instance();
const spy = jest.spyOn(instance, 'uploadFile');
Но это не объясняет происходящее изменение состояния.
Вот мой полный тест
it(' handleUploadClick prop should call onUploadClick and uploadFile', () => {
const blob = new Blob(['totally legit scan'], { type: 'text/plain' });
const name = 'scan.zip';
wrapper.setState({ selectedFile: blob, apiFieldName: name });
const instance = wrapper.instance();
const spy = jest.spyOn(instance, 'uploadFile');
wrapper.instance().handleUploadClick();
expect(props.onUploadClick).toBeCalled();
expect(spy).toBeCalled();
});
Я хочу проверить, что устанавливаются buttonState, errorMessage и uploadProgress. Что мне нужно смоделировать, а затем протестировать, чтобы это стало возможным?
expect(wrapper.state.buttonState).toEqual('')
expect(wrapper.state.errorMessage).toEqual('')