- ruft Reagieren v15.1.0
- Jest v12.1.1
- Enzyme v2.3.0
Ich versuche, finde heraus, wie man eine Komponente testet, die eine Zusage in einer Funktion aufruft, die durch einen Klick aufgerufen wird. Ich habe erwartet, dass die runAllTicks()
Funktion von Jest mir hier hilft, aber es scheint das Versprechen nicht auszuführen.Testen mit Reagieren des Jest und Enzyme, wenn simuliert Klicks eine Funktion aufrufen, die ein Versprechen
Komponente:
import React from 'react';
import Promise from 'bluebird';
function doSomethingWithAPromise() {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 50);
});
}
export default class AsyncTest extends React.Component {
constructor(props) {
super(props);
this.state = {
promiseText: '',
timeoutText: ''
};
this.setTextWithPromise = this.setTextWithPromise.bind(this);
this.setTextWithTimeout = this.setTextWithTimeout.bind(this);
}
setTextWithPromise() {
return doSomethingWithAPromise()
.then(() => {
this.setState({ promiseText: 'there is text!' });
});
}
setTextWithTimeout() {
setTimeout(() => {
this.setState({ timeoutText: 'there is text!' });
}, 50);
}
render() {
return (
<div>
<div id="promiseText">{this.state.promiseText}</div>
<button id="promiseBtn" onClick={this.setTextWithPromise}>Promise</button>
<div id="timeoutText">{this.state.timeoutText}</div>
<button id="timeoutBtn" onClick={this.setTextWithTimeout}>Timeout</button>
</div>
);
}
}
Und die Tests:
import AsyncTest from '../async';
import { shallow } from 'enzyme';
import React from 'react';
jest.unmock('../async');
describe('async-test.js',() => {
let wrapper;
beforeEach(() => {
wrapper = shallow(<AsyncTest />);
});
// FAIL
it('displays the promise text after click of the button',() => {
wrapper.find('#promiseBtn').simulate('click');
jest.runAllTicks();
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('#promiseText').text()).toEqual('there is text!');
});
// PASS
it('displays the timeout text after click of the button',() => {
wrapper.find('#timeoutBtn').simulate('click');
jest.runAllTimers();
wrapper.update();
expect(wrapper.find('#timeoutText').text()).toEqual('there is text!');
});
});
Sie können stattdessen doSomethingWithAPromise Funktion als Stütze zu AsyncTest Komponente zu übergeben, so dass Sie es in Ihrem Test verspotten: http://stackoverflow.com/questions/38308214/react-enzyme-test-componentdidmount-async-call/40875174 # 40875174 – bodrin