【发布时间】:2020-02-08 10:13:12
【问题描述】:
在过去的几周里,我一直在努力用玩笑对文件上传反应组件进行单元测试。具体来说,我正在尝试测试方法onReadAsDataUrl 是否在我的一种方法中从FileReader 调用。这是我正在测试的示例方法:
loadFinalImage = async (file) => {
const reader = new FileReader();
reader.onloadend = () => {
this.setState({
imagePreviewUrl: reader.result,
validCard: true,
});
};
await reader.readAsDataURL(file);
}
这就是我试图模拟 FileReader 并测试是否调用了 onReadAsDataUrl 的方式:
it('is a valid image and reader.onReadAsDataUrl was called', () => {
const file = new Blob(['a'.repeat(1)], { type: 'image/png' });
wrapper = shallow(<ImageUpload />).dive();
const wrapperInstance = wrapper.instance();
const mockReader = jest.fn();
jest.spyOn('FileReader', () => jest.fn());
FileReader.mockImplementation(() => { return mockReader });
const onReadAsDataUrl = jest.spyOn(mockReader, 'readAsDataURL');
wrapperInstance.loadFinalImage(file);
expect(onReadAsDataUrl).toHaveBeenCalled();
});
在我运行:yarn jest 后,我得到以下测试失败:
无法窥探原始值;给定的字符串。
我假设我收到此错误是因为我没有导入 FileReader,但我不确定如何导入或模拟它,因为 FileReader 是一个接口。这是测试失败的图像:
我对 jest、reactjs 和 Web 开发有点陌生,但我很想学习如何解决这个问题。到目前为止,我查看的一些资源是:Unresolved Shopify Mock of FileReader、How to mock a new function in jest 和 Mocking FileReader with jasmine。
任何帮助将不胜感激!提前谢谢你。
【问题讨论】:
-
根据文档:jestjs.io/docs/en/jest-object#jestspyonobject-methodname,函数签名是:
jest.spyOn(object, methodName)您是否尝试在global中为 FileReader 创建一个模拟,然后改为使用jest.spyOn(global, 'FileReader')? -
我将
jest.spyOn('FileReader', () => jest.fn())换成了jest.spyOn(global, 'FileReader'),错误信息变成了这一行:FileReader.mockImplementation(() => { return mockReader })。新的错误信息是:TypeError: _sys.default.mockImplementation is not a function
标签: javascript reactjs unit-testing jestjs filereader