1 测试用例里面我遇到的最大问题就是获取元素,进行断言,有的时候不知道为什么就获取不到,或者不知道怎么断言,真的是醉了
2 每次测试的时候,做个测试快照,这我感觉还行,比较简单,就是有三种渲染方式,后面会用到,懒得写了,发一下其他人的链接吧. https://www.tangshuang.net/4070.html
我的快照代码如下:
import React from 'react';
mport xxxfrom '../../../pages/xxx/xxxx';
import renderer, { act } from 'react-test-renderer';
import { mount, shallow, render } from 'enzyme';
jest.useFakeTimers();
const wrapper = shallow(<xxx/>);
const mountWrapper = mount(<xxx/>);
const renderWrapper = render(<xxx/>);
const tree = renderer.create(<xxx/>, {
createNodeMock: node => {
return document.createElement(node.type)
}
}).toJSON();
it('renders correctly', () => {
act(() => {
expect(tree).toMatchSnapshot();
})
});
3 对于测试用例,我们不可避免的就是对于接口的模拟,所以我们就需要造一些假数据来跑我们原本的js文件
对于一个完整的项目来说,基本都有server层,里面封装这我们接口的url,get还是post,参数什么的,而前端调用接口的方式也很多啊,ajax,axios,fetch等等,所以怎么模拟就看你原本代码怎么写,中心思想就是把原本的替换掉
下面是我替换的一个例子,因为我们最终返回的是一个promise,所以就直接模拟一下,这里要特别感谢这个链接,https://cloud.tencent.com/developer/news/145296,里面有代码的目录结构,让我豁然开朗
let statusCode;
export function setStatus(code) {
statusCode = code; 根据code不同返回不一样的数据
}
const baseUrl = '';
export function httpGet(path, query) {
let url = baseUrl + path; // api url
let getLocalUrl = getLocalDataUrl(url) //处理一下url方便我们建立假数据的文件名
// console.log(getLocalUrl, 'getLocalUrl')
let method = 'get';
try {
return new Promise((resolve, reject) => {
const mockData = require(`../__mockData__/${getLocalUrl}.data`).default; // 获取假数据
const result = mockData[`${method.toUpperCase()} ${statusCode}`];
if (statusCode == 200) {
resolve(result)
} else {
let err = result
reject(err)
}
});
} catch (err) {
return err
}
}
4 接下来就是对useEffect测试一下,在快照代码上面添加几行代码即可:
jest.mock('../../../@core/HttpRequest.js')
import renderer, { act } from 'react-test-renderer';
import HttpRequest, { setStatus } from '../../../@core/HttpRequest'
beforeEach(() => {
act(() => {
setStatus(200)
})
})
这样就可以跑到useEffect,但是只能跑成功case,那种失败的api请求没能模拟到,尴尬,好多代码没跑到就是因为这个问题
5 然后就是对于元素的click,change什么的,也就是找到元素,simulate一些他们的时间,类似于jq吧.下面给两个实例代码
wrapper.find('#fromDt').simulate('change', { target: { value: '3333' } })
wrapper.find('#searchCurrency').simulate('click')
可以定义id或者class在元素上面,然后找就好了
6 组件内部又使用了组件.
使用dive(),详情可以在enzyme文档上看到,下面是我的实例代码
wrapper.find(xxx组件名字).dive().find('#sortId').at(0).simulate('click') //如果数据多条,可以使用at(数字),来指定对哪个元素进行操作
7--------------------------------------------------------------------------------------------------------------------以后想到再补充吧
8 https://jestjs.io/docs/zh-Hans/setup-teardown 关于jest的分组还是要看一下的,对于if判断很有用处
