javascript - 使用 svg 渲染图像标签时,使用酶反应组件单元测试失败
问题描述
我正在使用带有 Typescript 的 React,并使用 Jest 和 Enzyme 进行单元测试。我正在尝试对以下组件进行单元测试(当然是简化的):
import image1 from 'path/to/image1.svg';
import image2 from 'path/to/image2.svg';
export const ShowImage: React.StatelessComponent<{isTab1: boolean, someId: number, isTab2: boolean }> = ({ isTab1, someId, isTab2}) => (
<td>
{isTab1 !== true && someId === 1 && !isTab2 ?
<Image1 />
:
null
}
{isTab1 !== true && someId === 2 && !isTab2 ?
<Image2 />
:
null
}
</td>
);
export const Image1 = () => (
<Image src={image1} />
);
export const Image2 = () => (
<Image src={image2} />
);
该Image
标签是一个 React Bootstrap 标签。我正在测试ShowImage
文件中测试组件,如下所示:
import * as React from 'react';
import * as Enzyme from 'enzyme';
import { mount, shallow } from 'enzyme';
import * as Adapter from 'enzyme-adapter-react-15';
Enzyme.configure({ adapter: new Adapter() });
function setupShowImageComponent(isTab1: boolean, someId: number, isTab2: boolean): any {
const props = {
isTab1: isTab1,
someId: someId,
isTab2: isTab2
};
const enzymeWrapper = mount(<ShowImage {...props} />);
return {
props,
enzymeWrapper
}
}
describe('Test ShowImage Component', () => {
it('false, 1, false', () => {
const { enzymeWrapper } = setupShowImageComponent(false, 1, false);
expect(enzymeWrapper.find('td')).toHaveLength(1);
expect(enzymeWrapper.find('Image1')).toHaveLength(1); // fails: receives length 0
expect(enzymeWrapper.find('Image2')).toHaveLength(0);
});
it('false, 2, false', () => {
const { enzymeWrapper } = setupShowImageComponent(false, 2, false);
expect(enzymeWrapper.find('td')).toHaveLength(1);
expect(enzymeWrapper.find('Image1')).toHaveLength(0);
expect(enzymeWrapper.find('Image2')).toHaveLength(1); // fails: receives length 0
});
});
这两个测试都失败了。我正在测试的其他 React 组件都通过了,但是这个让我望而却步。任何帮助将不胜感激。重要的是要注意这曾经可以工作,但是当我将代码迁移到使用 TypeScript 时,这两个测试都失败了。
更新
经过一些实验,如果我测试Image
标签的存在而不是Image1
它的Image2
工作原理。似乎它不识别功能组件,而是识别它的子组件?我在这里很困惑。我如何测试它是专门的Image1
还是Image2
不仅仅是测试Image
?同样,这适用于 Javascript,但不适用于 TypeScript。
解决方案
我找到了一个可行的解决方案。而不是这样做:
expect(enzymeWrapper.find('Image1')).toHaveLength(1); // fails
做:
expect(enzymeWrapper.find(Image1)).toHaveLength(1); // passes
我不确定这是否是最好的解决方案,但它让我克服了我的问题。
推荐阅读
- c# - 使用 C# ADO.NET 将多行字符串写入 SQL Server?
- excel - 索引和匹配公式 | 找到用户匹配最高值
- laravel - 带有过滤器“ILIKE”的 Laravel 雄辩查询与保存在我的 Postgre 数据库中的任何带有重音的值都不匹配(以 UTF8 编码)
- swift - 快速切换定时事件的图像
- excel - 复制工作表
- javascript - 可以使用数组作为对象的属性值吗?
- coq - 用 mathcomp 实例化一个 Zn 的交换环
- php - RentCafe API JSON
- asp.net - 如何使用位于 GridView 外部的按钮更新由 Asp GridView 中选定行指定的数据库中的所有数据?
- performance - 如何阅读 Chrome DevTools 中的网络选项卡 - 加载时间