@@ -79,3 +79,36 @@ class StylesPane extends UI.Widget {
7979[https://source.chromium.org/chromium/chromium/src/+/main:third\_ party/devtools-frontend/src/front\_ end/panels/developer\_ resources/DeveloperResourcesListView.ts;l=86](https://source.chromium.org/chromium/chromium/src/+/main:third_party/devtools-frontend/src/front_end/panels/developer_resources/DeveloperResourcesListView.ts;l=86)
8080
8181[https://source.chromium.org/chromium/chromium/src/+/main:third\_ party/devtools-frontend/src/front\_ end/panels/timeline/TimelineSelectorStatsView.ts;l=113](https://source.chromium.org/chromium/chromium/src/+/main:third_party/devtools-frontend/src/front_end/panels/timeline/TimelineSelectorStatsView.ts;l=113)
82+
83+
84+ ### Unit tests
85+
86+ When testing presenter behavior await a view update or a model call:
87+
88+ ` ` ` ts
89+ // ✅ recommended: stub the view function.
90+ const view = sinon .stub ();
91+ const presenter = new Presenter (view );
92+
93+ // ✅ recommended: expect a view stub call in response to presenter behavior.
94+ const viewCall = expectCall (view );
95+ present .show ();
96+ const [{onEvent }] = await viewCall ;
97+
98+ // ✅ recommended: expect a view stub call in response to an event from the view.
99+ const viewCall2 = expectCall (view );
100+ onEvent ();
101+ const [{data }] = await viewCall2 ;
102+ assert .deepStrictEqual (data , {});
103+
104+ // ❌ not recommended: Widget.updateComplete only reports a current view update
105+ // operation status and might create flakiness depending on doSomething() implementation.
106+ presenter .doSomething ();
107+ await presenter .updateComplete ;
108+ assert .deepStrictEqual (view .lastCall .args [0 ], {});
109+
110+ // ❌ not recommended: awaiting for the present logic to finish might
111+ // not account for async or throttled view updates.
112+ await presenter .doSomething ();
113+ assert .deepStrictEqual (view .lastCall .args [0 ], {});
114+ ` ` `
0 commit comments