gpt4 book ai didi

javascript - 如何在开 Jest 中使用模拟更改来测试 FileReader onload?

转载 作者:行者123 更新时间:2023-12-04 13:14:31 27 4
gpt4 key购买 nike

SimpleDialog.jsx

const [imagePreview, setImagePreview] = React.useState(null);

const handleChangeImage = event => {
let reader = new FileReader();
let file = event.target.files[0];

reader.onload = event => {
console.log(event);

setImagePreview(event.target.result);
};

reader.readAsDataURL(file);
};

return (
<div>
<input
accept="image/*"
id="contained-button-file"
multiple
type="file"
style={{ display: 'none' }}
onChange={handleChangeImage}
/>

<img id="preview" src={imagePreview} />
</div>
);

SimpleDialog.test.js

it('should change image src', () => {
const event = {
target: {
files: [
{
name: 'image.png',
size: 50000,
type: 'image/png'
}
]
}
};

let spy = jest
.spyOn(FileReader.prototype, 'onload')
.mockImplementation(() => null);

wrapper.find('input[type="file"]').simulate('change', event);

expect(spy).toHaveBeenCalled();

expect(wrapper.find('#preview').prop('src')).not.toBeNull();
});

运行测试时,它给我错误 TypeError: Illegal invocation

谁能帮我做这个单元测试?我只想模拟图像的 src 是否有值(value)。

最佳答案

错误的原因是 onload 被定义为属性描述符并将其分配给 FileReader.prototype 这是由 spyOn 完成的'支持。

没有理由模拟 onload,因为它已在测试代码中分配并需要测试。

直接的方法是不修补 JSDOM FileReader 实现,而是将其完全 stub :

jest.spyOn(global, 'FileReader').mockImplementation(function () {
this.readAsDataURL = jest.fn();
});

wrapper.find('input[type="file"]').simulate('change', event);


let reader = FileReader.mock.instances[0];
expect(reader.readAsDataURL).toHaveBeenCalledWith(...);
expect(reader.onload).toBe(expect.any(Function));

expect(wrapper.find('#preview').prop('src')).toBeNull();

reader.onload({ target: { result: 'foo' } });

expect(wrapper.find('#preview').prop('src')).toBe('foo');

关于javascript - 如何在开 Jest 中使用模拟更改来测试 FileReader onload?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61572070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com