用jest测试Echarts react组件,EchartElement为null
Testing Echarts react component with jest, EchartElement is null
正在对具有多个嵌套子组件的组件进行 snapchot 测试,其中一个包含 Echart(条形图)。在浏览器中渲染时,EchartElement 设置为图表 dom 元素:
<div class="echarts-for-react " _echarts_instance_="ec_1551342959315" size-sensor-id="1" style="height: 360px; -webkit-tap-highlight-color: transparent; user-select: none; position: relative; background: transparent;">
...
</div>
但是 运行 测试为 null,这使得测试失败。我需要以某种方式嘲笑这个吗?听起来不对...它期望的所有属性也在测试模式下正确传递...我检查过...
是否有一些configuration/setup我需要让 Echarts 与 Jest 一起工作?
是的,我不得不模拟 ref 对象:
function createNodeMock(element: any) {
return {
getSomething: jest.fn(() => 'pizza'),
setSomething: jest.fn(),
property: null,
}
}
it('Renders show correctly', () => {
const options = { createNodeMock }
const tree = renderer
.create(
<Show/>,
options
)
.toJSON()
expect(tree).toMatchSnapshot()
})
每次我 运行 进入错误 运行 测试时,我都会去调用方法或 属性 的地方,记录控制台,查看在浏览器并在模拟数据中设置数据。也许有更好的方法来做到这一点,但它已经完成了......
事实证明,我的第一个答案最终对我不起作用...我保留了 运行 测试并修复了它抱怨的任何问题,但总有其他问题...
所以在同事的帮助下,解决方案是通过模拟触发渲染的函数来阻止React Echarts调用Echarts。
let spy: any
beforeAll(() => {
spy = jest.spyOn(echarts, 'getInstanceByDom').mockImplementation(() => {
return {
hideLoading: jest.fn(),
setOption: jest.fn(),
showLoading: jest.fn()
}
})
})
afterAll(() => {
spy.mockRestore()
})
it('Renders show correctly', () => {
const tree = renderer
.create(
<Show />
)
.toJSON()
expect(tree).toMatchSnapshot()
})
在我们的例子中,我们对实际测试 canvas 渲染部分不感兴趣,所以这对我们有用。
正在对具有多个嵌套子组件的组件进行 snapchot 测试,其中一个包含 Echart(条形图)。在浏览器中渲染时,EchartElement 设置为图表 dom 元素:
<div class="echarts-for-react " _echarts_instance_="ec_1551342959315" size-sensor-id="1" style="height: 360px; -webkit-tap-highlight-color: transparent; user-select: none; position: relative; background: transparent;">
...
</div>
但是 运行 测试为 null,这使得测试失败。我需要以某种方式嘲笑这个吗?听起来不对...它期望的所有属性也在测试模式下正确传递...我检查过...
是否有一些configuration/setup我需要让 Echarts 与 Jest 一起工作?
是的,我不得不模拟 ref 对象:
function createNodeMock(element: any) {
return {
getSomething: jest.fn(() => 'pizza'),
setSomething: jest.fn(),
property: null,
}
}
it('Renders show correctly', () => {
const options = { createNodeMock }
const tree = renderer
.create(
<Show/>,
options
)
.toJSON()
expect(tree).toMatchSnapshot()
})
每次我 运行 进入错误 运行 测试时,我都会去调用方法或 属性 的地方,记录控制台,查看在浏览器并在模拟数据中设置数据。也许有更好的方法来做到这一点,但它已经完成了......
事实证明,我的第一个答案最终对我不起作用...我保留了 运行 测试并修复了它抱怨的任何问题,但总有其他问题...
所以在同事的帮助下,解决方案是通过模拟触发渲染的函数来阻止React Echarts调用Echarts。
let spy: any
beforeAll(() => {
spy = jest.spyOn(echarts, 'getInstanceByDom').mockImplementation(() => {
return {
hideLoading: jest.fn(),
setOption: jest.fn(),
showLoading: jest.fn()
}
})
})
afterAll(() => {
spy.mockRestore()
})
it('Renders show correctly', () => {
const tree = renderer
.create(
<Show />
)
.toJSON()
expect(tree).toMatchSnapshot()
})
在我们的例子中,我们对实际测试 canvas 渲染部分不感兴趣,所以这对我们有用。