In meinen Tests möchte ich meinen Hauptthread blockieren, bis eine meiner Komponenten die Lebenszyklusmethoden durchläuft, und zwar durch componentDidUpdate()
, nachdem ich ein Ereignis ausgelöst habe, das dazu führt, dass untergeordnete Komponenten hinzugefügt werden zu sich selbst. Wie kann ich das tun?Warten, bis eine React-Komponente die Aktualisierung abgeschlossen hat
Etwas wie folgt aus:
describe('my <Component />',() => {
it('should do what I want when its button is clicked twice',() => {
const wrapper = mount(<Component />);
const button = wrapper.find('button');
// This next line has some side effects that cause <Component /> to add
// some children components to itself...
button.simulate('click', mockEvent);
// ... so I want to wait for those children to completely go through
// their lifecycle methods ...
wrapper.instance().askReactToBlockUntilTheComponentIsFinishedUpdating();
// ... so that I can be sure React is in the state I want it to be in
// when I further manipulate the <Component />
button.simulate('click', mockEvent);
expect(whatIWant()).to.be.true;
});
});
(Ich möchte, dies zu tun, weil, gerade jetzt, ich diese Warnung erhalten:
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.
Ich glaube, ich bin immer es, weil meine Tests meine verursachen Um den internen Zustand schneller zu ändern, als Reacts interne Multithreading-Magie mithalten kann, hat React die neuen Kindkomponenten instanziiert, bis ich das erste Mal button.simulate('click')
ausgeführt habe, aber noch nicht fertig für Reagieren, um Aktualisierung zu beenden meine Komponente und ihre Kinder ing ist der beste Weg, um dieses Problem zu lösen)
Was bedeutet der Click-Handler tun? Alle Statusänderungen sollten synchron sein, es sei denn, Sie haben spezielle Timer-/Async-Funktionen. – Jacob
DOM-Updates sind auch synchron, es sei denn, Sie tun etwas seltsam oder verwenden eine exotische Variante von React. Ich wäre nicht überrascht, wenn Ihre 'setState'-Warnung darauf beruht, dass Ihre Komponente selbst vor dem Einhängen einen' setState' ausführt. – Jacob
@ Jacob Ich benutze eine Drittanbieter-Bibliothek, [React Widgets] (https://jquense.github.io/react-widgets/docs/). Meine ' ' hat ein React Widgets 'DateTimePicker' als eines seiner Kinder, und die Warnung scheint aus dem' DateTimePicker' ausgegeben zu werden. So bin ich mir leider sicher, was mein Ereignis verändert und ich kann nicht einfach versuchen, in die Komponente zu schauen, um sicherzustellen, dass sie sich nicht benimmt. –
Kevin