Issue
I have a case where I use NgForm validation on an input[type="file].
The code works fine in a real case scenario (browser usage).
However on the testing part itself I have a code that prevent the actual form data submission (including the file) if there is an error in the ngForm (by checking ngForm.valid).
The following test is considering that the ngForm.valid === false so the test fails:
it('should do a SubsectionSave save on submit and attach file', async () => {
const dataTransfer = new DataTransfer();
dataTransfer.items.add(await testGetExampleFile()); // testGetExampleFile returns a valid File object
// set file and trigger event
const inputDebugEl = fixture.debugElement.query(By.css('input[type=file]'));
inputDebugEl.nativeElement.files = dataTransfer.files;
inputDebugEl.nativeElement.dispatchEvent(new InputEvent('change'));
fixture.detectChanges();
await fixture.whenStable();
component.submit(); // this submit function checks the .valid on the ngForm, but does nothing
// expect(a-backend-save-call).toBeDone();
// but nothing is done because the submit() stops at the .valid checking
});
The way to put a file into the input from the test case itself was inspired by How to write the unit testing for the file upload method in the Angular 7 (or 2+)
I have checked the ngForm.controls before the ngForm.valid check (in the actual implementation) and there are multiple required fields but the only one to be marked as invalid (cause: required) is this required input-file.
Is there a way to force angular to detect the new presence of the new file?
I tried a mix of fixture.detectChanges();, waiting for 1sec after the change event being raised, await fixture.whenStable(); at several places after nativeElement files being set, but nothing worked.
How to deal with required input file within angular component tests ?
Solution
I finally found the solution, based on triggerEventHandler of the DebugElement, as shown here:
const file: File = await testGetExampleFile('pdf');
// set file and trigger event
const inputDebugEl = fixture.debugElement.query(By.css('input[type=file]'));
inputDebugEl.triggerEventHandler('change', { target: { files: [file] } });
Answered By - Micaël Félix
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.