Hello and thank you for your time reading this!
I am very interested to do unit tests while developing. I am new to tests in Javascript.
I have written a function to read files we choose,with an input, however I do not know how to test it.
I have read the documentation of Jasmine, about spies: https://jasmine.github.io/api/2.6/global.html#spyOn
And: https://jasmine.github.io/2.0/introduction.html
The code:
    function readImage() {
    if ( this.files && this.files[0] ) {
        var FR= new FileReader();
        var img = new Image();
        FR.onload = function(e) {
            img.src = e.target.result;
            img.onload = function() {
                ctx.drawImage(img, 0, 0, 512, 512);
            };
        };
        FR.readAsDataURL( this.files[0] );
    }
    return [this.files, FR, img, ctx];
}
fileUpload.onchange = readImage;
The test I tried:
describe('readImage', function () {
 it('should get at least one file ', function () {
        spyOn(window, 'readImage');
        fileUpload.dispatchEvent(new Event('onchange'));
        expect(window.readImage).toHaveBeenCalled();
    })
});
Also, fileUpload is:
    function createUploadInput() {
    body = document.getElementsByTagName("BODY")[0];
    upload = document.createElement("input");
    upload.setAttribute("type", "file");
    upload.setAttribute("id", "fileUpload");
    body.appendChild(upload);
    return upload;
}
createUploadInput();
The output I get:
        Expected spy readImage to have been called.
    Error: Expected spy readImage to have been called.
        at jasmine.Spec.<anonymous> (test/readImageSpec.js:42:34)
I think it is because of the readImage method has not been called in the test. The reason could be because             fileUpload.dispatchEvent(new Event('onchange')); does nothing
Could you help me please?
I have also read: How to trigger event in JavaScript?
Triggering event for unit testing
Using Jasmine to spy on a function without an object
Thank you for your help!
I have tried:
it('should get at least one file ', function () {
    spyOn(window, 'readImage');
    fileUpload.dispatchEvent(new Event('change'));
    expect(window.readImage).toHaveBeenCalled();
})
But output is:
   Expected spy readImage to have been called.
        Error: Expected spy readImage to have been called.
            at jasmine.Spec.<anonymous> (test/readImageSpec.js:42:34)
Also I tried:
it('should get at least one file ', function () {
    spyOn(window, 'readImage');
    fileUpload.onchange();
    expect(window.readImage).toHaveBeenCalled();
})
And output:
Expected spy readImage to have been called.
Error: Expected spy readImage to have been called.
    at jasmine.Spec.<anonymous> (test/readImageSpec.js:42:34)
I have also read: How can I trigger an onchange event manually?
