I have an Angular 4 component that has an <input> of type file. I want to create a Jasmine test that verifies that the event handler is called when the input field receives a file.
This is the component:
<div>
<input type="file" (change)="fileChange($event)" placeholder="Upload file" accept=".xls, .xlsx" style="padding-left: 5px">
</div>
This is the event handler:
fileChange(event) {
let fileList: FileList = event.target.files;
if (fileList.length > 0) {
// save the file to the backend - this behaviour is tested in a different test
}
}
And this is the test case I have so far, cobbled together from various answers on Stackoverflow (e.g. some of these answers) which seems to have worked in Angular 2, but not in Angular 4:
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('file change event should arrive in handler', () => {
let input = fixture.debugElement.query(By.css('input[type=file]')).nativeElement;
input.value = {name: 'excel'};
input.dispatchEvent(new Event('input'));
// check that the event handler has been called
spyOn(component, 'fileChange');
expect(component.fileChange).toHaveBeenCalled();
});
The problem is that Karma displays SecurityError: The operation is insecure. for the line input.value = {name: 'excel'};. Is there another way to manually assign the value of the input field or at least get it to send an event that is handled by fileChange?
Is there another way to manually assign the value of the input field
You can't assign value to input[type="file"] due to security reasons.
or at least get it to send an event that is handled by fileChange
You can fire change event after spyOn:
spyOn(component, 'fileChange');
input.dispatchEvent(new Event('change'));
expect(component.fileChange).toHaveBeenCalled();
Plunker Example
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With