Closed wangzixi-diablo closed 3 years ago
for issue: https://github.com/SAP/spartacus/issues/9294
There is known issue in Angular testing framework. The fixture.detectChanges()
works only when called for the first time in spec if your component has cofigured ChangeDetectionStrategy.OnPush
. (See angular issue: https://github.com/angular/angular/issues/12313)
You can fix it, by amending the ChangeDetectionStrategy for your testing component, using TestBed.overrideComponent
. See for example:
https://github.com/SAP/spartacus/blob/develop/projects/storefrontlib/src/shared/components/table/table.component.spec.ts#L42-L44
Reference article: https://medium.com/@juliapassynkova/how-to-test-onpush-components-c9b39871fe1e
background
file location: projects\storefrontlib\src\cms-components\checkout\components\delivery-mode\delivery-mode.component.html
we are now talking about property binding of "continue" button's disabled property.
Expected behavior
when component property deliveryModelnvalid = true, continue button's disabled property will be set as true as well, so button is disabled, and vice versa.
Below is the getter implementation of deliveryModeInvalid in Component:
so if we set this.mode.controls['deliveryModeId'] to '' or null, deliveryModeInvalid will equal to true.
Jerry's observation in unit test
if we change the value of this.mode.controls['deliveryModeId'] TWICE in the same test spec, [disabled] and deliveryModeInvalid will LOSE synchronization, even fixture.detectChanges is called manually.
See my test below.
Paste the following source code to replace your delivery-mode.component.spec.ts and launch it:
In this unit test file I construct four test specs:
(1) set delivery mode id to a valid value first, then set null; (2) set delivery mode id to null first, then set a valid value to it; (3) only set a valid value; (4) only set null;
In each test spec, once I manupulate the value of this.mode.controls['deliveryModeId'], then use console.log to display the following pair of values:
In theory the two must always be equal.
Test result
Conclusion
Avoid change delivery mode id TWICE in a single test spec. The case to set id as A in beforeEach and set id as B in a test spec SHOULD also be considered as TWICE, so the two value will lose synchronization as well.