范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

vueutilsjest实战代码举例

  网上有很多vue-test-utils + jest 的相关文章,大体上可以分为两个流派: 配置搭建派 特殊问题派
  通观起来总觉得似乎对于真正想要实施单元测试的入门开发人员来说,缺了一环:面对具体场景时,应该如何进行单元测试编码。
  这篇文章就根据不同场景,列出一些真实的代码示例。希望能够帮助到想要真正实施单元测试的团队。 mock 实例方法
  场景举例
  submit方法内,一般会调用校验方法,依赖校验方法的返回 true || false 来判断是否进行实际提交逻辑的执行。
  但有时候需要测试的方法内调用的其他方法很难构造,比如校验方法需要传递若干参数,而且所有参数必须合规才能继续执行提交的代码逻辑。那么此时让校验方法直接通过比较好。
  当然这引出另外一个话题,我们在进行单元测试的时候是否应该连带引用方法一起测试?
  我的看法是,既然是单元测试,那么引用方法不一定必须全部覆盖到,原因如下: 在TDD过程中需测试的方法和其中的引用方法不一定是同一个人负责的 单元测试应该仅为当前测试方法的逻辑是否正确负责,如提交方法需要考虑的是提交的各种成功或者失败场景,而校验方法应该自行通过自己的单元测试代码来确保校验本身是否正确
  因此在这种场景下,我们对于特别复杂的引用方法可以考虑进行mock。
  代码如下 jest.spyOn(wrapper2.vm, "validate").mockImplementation(() => {return true}) wrapper2.vm.handleSubmit()  // 再直接调用提交方法的话,校验方法就会直接返回成功,以便我们直接对提交内部的方法进行测试对于特定字段的断言
  场景举例
  有时候在逻辑代码中一个方法的调用,其参数可能非常庞大,但是对于某种测试场景来说,我们只需要判断参数中是否含有某几个特定字段或者值。
  比如我们调用一个方法,其代码如下 function fn () {     ...     let params = {         key1: value1,         key2: value2,         key3: value3,         ...         keyn: valuen     }     ...     request.get(params) }
  在进行单元测试编写中,我们需要校验的是某种场景下,params必须含有 keyJ = J 的参数值。此时,我们不需要对整个params对象进行断言 let params = {   key1: value1,   key2: value2,   key3: value3,   ...   keyn: valuen } // 上面完全手动构建了完整的参数对象,不要这样做 expect(request.get).toBeCalledWith(params)
  如果只关心一个大对象其中的某个字段的值,不要像上面这样编写测试代码,请参考下面的测试代码示例 expect(request.get).toBeCalledWith(expect.objectContaining({     key3: 42 // 假设我们构建的测试场景只需要特别关注该场景下的key3 值必须为 42 }))关于refs的处理
  在业务代码中含有调用当前组件refs引用自组件,并调用他们方法的时候要怎么处理呢?
  考虑如下场景 methods: {     save: () => {     this.$refs[name].validate((valid) => {         if (valid) {             ......       }     })   } }
  我们应该如何为save方法编写测试代码?
  如果使用vue test utils的shallowMount方法,实际上不会在测试中实例化嵌套组件。比如上面这段代码,这里引用到的refs指向的是Form组件。如果直接在测试中执行wrapper.vm.save(),会报错显示调用了undefined 的 validate 方法。
  这时候需要在shallowMount的时候通过stubs属性来模拟加载一个嵌入的组件 const Form = {   render: jest.fn(),   methods: {     validate: (cb) => {cb(true)}   } }  wrapper = shallowMount(indexTip, {     localVue,     store,     propsData: {},     stubs: {Form} })
  先声明这个需要stub的Form组件。这个新声明的组件只用来模拟测试中可能需要的行为,以避免引起undefined的异常,所以只需要声明必要的方法即可。 render方法直接声明为jest.fn(),因为不需要实际渲染出任何html methods里边声明了validate方法,在测试代码中会实际调用这里的声明。注意stub的方法声明无论如何都会返回true。这里依然还是按照上面提及的原则,单元测试仅测试与当前函数相关的逻辑
  此外。在shallowMount的参数中,使用stubs属性内声明自定义的Form。
  这样,再次调用wrapper.vm.save 方法的时候,就不会报validate方法未定义了。
  注意:业务码中调用的是 refs.xxxname,其中 xxxnames 为模板中组件元素的ref名。但stub的时候需要声明的是组件的名称。比如上面的例子,业务代码中refname为xxxname,组件名为Form。这时候需要stub模拟的是Form,而不是xxxname。 Parent组件模拟
  与上面的场景相反,这次我们讨论如果业务代码中有关于parent组件的调用应该如何编写测试代码。 this.$parent.getList()
  虽然我认为直接调用parent的方法不是一种良好的实践,但是谁让vue提供了这样的能力呢,你就不能保证没有人会这么用。对于这种场景的测试代码,原理跟上面一个场景是类似的,只是在shallowMount的调用中有一点不同,我们看具体代码 const Parent = {   data: () => ({     val: true   }),   methods: {     getList: () => {} // 当然如果业务代码中需要依赖getList方法的返回,也可以在这里return result   },   template: "" }  // 接下来在shallowMount的时候声明父组件即可 wrapper = shallowMount(indexTip, {     parentComponent: Parent, // 声明父组件为上面边定义的Parent     localVue,     store,     propsData: {} })mock异步请求
  在测试中,经常会碰到需要针对不同异步请求的结果编写测试代码的情况。
  比如接口返回 code: 0 的时候做什么处理,code: 1的时候做什么处理,甚至是请求在网络失败的情况下做什么处理 function fn (xxx) {     return axios.get(url, {id: xxx})         .then(res => {             if (res.code === 10000) {                 this.list = res.list             } else {                 this.fail(res.errmsg)             }         })         .catch(err => {             this.toast(err.message)         }) }
  如上代码,我们要测试的函数叫做fn,其中调用了一个异步请求,那么我们在测试代码中需要获取到这个异步Promise对象才能对其内部逻辑编写测试代码,因此fn函数需要返回这个Promise对象。
  测试代码如下 it("getMarkerList test case", async () => {   await wrapper.vm.fn(xxx)   expect(wrapper.vm.list).toBe([...somelist]) // 断言此时vm.list 已被赋值成功 })
  进一步思考,既然是单元测试,是否不应该依赖接口的返回,比如我们需要测试没有网络连接的情况下前端代码的逻辑处理,总不能在持续集成过程中突然拔网线吧。
  所以我们还需使用jest提供的mock promise能力 对Promise对象返回值的mock
  上面介绍了mock Promise对象的方法,可以让我们在没有实际进行网络调用的情况下就触发相应的处理逻辑。
  但大多数情况下,还要更加细分地对不同代码分支做断言。
  比如 if (res.code === 10000)      ... else if (res.code === 10002) {     if (res.hasSelected === true)          ...     else {         ...      } }
  因此,jest提供了快捷的方法来进行不同返回值的模拟 axios.get.mockResolvedValue({code: 10000, list: [1, 2, 3]}) // 模拟成功的状态 await wrapper.vm.fn() expect(wrapper.vm.list.length).toBe(3) // 断言fn内部promise调用成功时,list属性应该是一个三个元素的数组  axios.get.mockResolvedValue({code: 10001, msg: "id not fount"}) // 模拟没有找到该id的对应记录 await wrapper.vm.fn() expect(wrapper.vm.fail).toBeCalledWith("id not found") // 断言fn此场景下,fail方法被调用且参数为 ‘id not found’  axios.get.mockRejectedValue("networkError") // reject 的情况 await wrapper.vm.getLouDong() expect(wrapper.vm.toast).toBeCalledWith("networkError")模拟setTimeout
  业务代码中,可能会在方法内部执行setTimeout,过一定时间之后,再进行某些操作,比如 submit () {     this.toast("清空中")   setTimeout(() => {         this.loaded = []   }, 300) }
  这个场景可能是出于用户体验的考虑。
  那么如果按照常规的方法,我们在执行了getNewList方法之后就马上去进行断言,则测试肯定是无法通过的。
  针对这种情况,jest提供了一个有用的功能,useFakeTimers 。
  在测试代码中只需要声明jest.useFakeTimers 然后再调用相应方法,让假的计时器向前或者向后若干毫秒即可,看代码 it("submit test case", () => {   jest.useFakeTimers()   wrapper.vm.submit()   jest.advanceTimersByTime(350)   expect(wrapper.vm.loaded.length).toBe(0) })模拟window.location
  在业务代码中经常会碰到需要使用当前URL来进行判断的场景,但在jest中我们不能直接对window.location进行赋值来模拟这个场景,如何做到?
  比如我们需要根据 location.search 中包含特定的参数值来执行不同的代码分支。
  可以按照两个步骤来进行模拟: 自定义window对象,覆盖jsdom中的window对象 通过defineProperty对window.location对象进行赋值 global.window = Object.create(window); const url = "http://dummy.com?foo=bar"; Object.defineProperty(window, "location", {   value: {     href: url,     search: "?foo=bar"   } });  expect(global.location.search.indexOf("foo") > -1).toBeTruthy()
  注意:由于覆盖了全局变量location, 因此要注意其只在某一个测试用例中起作用,否则会导致其他测试用例失败。

兄弟打印机清零兄弟2240D打印机清零方法1。在电源开着的情况下,打开打印机前盖,让它开着。2。关掉电源3。按住GO键的同时打开打印机开关。这是所有的灯应该都是亮着的。4。松开GO键5。按两次G2021数字经济产业发展指数报告发布中国发展网讯数字经济作为一种新型经济形态,正在深刻改变着传统行业,成为推动经济增长的重要引擎。近日,北京大数据研究院大数据分析技术创新中心在已有研究的基础上,聚焦企业微观主体,编制李礼辉抓紧研发数字人民币的批发型功能10月23至24日,由财经杂志财经智库主办的2021全球财富管理论坛打造开放创新的财富管理新高地在京举办。会上,中国互联网金融协会区块链研究组组长中国银行原行长李礼辉就数字货币问题流量红利消退后的双11私域运营会是中国电商的新出路吗?科创板日报(记者,上海黄心怡)又到一年双11,作为整个中国电商行业一年一度的消费狂欢,双11正在迎来第13个年头。在过去的13年中,互联网生态发生了巨大的变化。从传统线下交易演变成20212027全球与中国物联网智能燃气表市场现状及未来发展趋势20212027全球与中国物联网智能燃气表市场现状及未来发展趋势报告篇幅119报告图表数149报告出版时间2021年10月本报告研究全球与中国市场物联网智能燃气表的产能产量销量销售NFT到元宇宙的锐变加密行业是一个神奇的行业,在加密行业可以说是充满了,无限的可能性。只有你想不到的,没有他办不到的。只要这个行业覆灭,一切皆有可能。人类的诞生可以说是一种奇迹,互联网的诞生也可以说是51支高校科研院所队伍比拼空天技术创新创意类桨扇结构机体自旋飞行器突破了现有框架束缚,创新自旋飞行方式,以桨扇状机身产生升力,获得了更好的静稳定性基于时空域信息的红外目标跟踪检测模型,可以利用目标的时空域信息对位置进行跟踪受强化版原型电池影响,松下股价涨至2018年以来新高彭博26日报道,松下电器涨幅高达6。6,达到2018年以来的最高水平。此前,该公司向媒体展示了其为特斯拉制造的下一代原型电池。同日,特斯拉的估值飙升至1万亿美元。据报道,松下能源业花高价买发烧机?2021年双11想要换新,这四款手机最值得选择2021年双11电商节手机换新怎么选?最近关于这个问题找侃哥的人真不少,其中很多人都提到了高通骁龙888和高通骁龙888Plus处理器,其实也能够理解,毕竟这可是2021年安卓阵营小米手机就是坑作为一个米粉,我特别喜欢雷军的演讲风格亲切,幽默,接地气。以及小米积极帮助受灾重建工作,小米公司很有社会责任感。小米每次开新品发布会我几乎每次都直播观看,特别是雷军,卢伟冰的发布会小米MIX4换新包装,推出主题探索版,起售价降至3999元在今年8月的雷军年度演讲上,全新的小米MIX4正式登场,这是MIX系列继2018年以来的回归之作,不少米粉苦等三年就是为了等这样一款优秀的产品问世。小米MIX4拥有独特的外观,整体
荣耀首款一亿像素手机,现已跌至新低价,256GB售价更亲民了自从独立运营之后,新荣耀在产品线策略发生了非常明显的改变,比如荣耀数字系列,不再一味追求堆料,而是力争在产品的综合素质方面给消费者带来优质的体验。这让某些网友表示不理解,甚至给荣耀为大家准备了几款三千元左右的手机,确定不来看看吗?小编为大家准备几款三千元手机,一起看看吧!不是杂牌噢,参数各方面确实还不错。型号realmeGT大师探索版参数5G双卡双待骁龙870三星FHD120HzOLED屏幕(曲面屏)240每日315安全问题频发里程焦虑续航不足小心新能源车企做减法在当今油价长期居高不下的背景下,新能源汽车越来越吃香。由于原材料价格上涨等原因,新能源汽车已逐渐供不应求,据统计3月以来新能源汽车销量大幅增长,甚至出现客户等不及直接购买展车的现象玩法丰富声音佳,HIDIZSMM2一动圈一静电耳机体验印象中Hidizs(海帝思)是以便携式播放器起家的,不过在近年来的发展中,除了当家花旦AP80这一枝儿外,也推出了耳机解码耳放(大小尾巴)等系列新品,形成了对音频各领域需求链的基本德勤中国合伙人汽车产业聚焦碳减排车企需建立全周期减碳意识中国财富网讯受疫情影响,4月份中国汽车产销量出现了较大幅度的下滑。但值得注意的是,4月新能源汽车产销依然高于上年同期水平,总体表现较好。当前,我国正持续深入推进双碳战略。作为仅次于因拒收人民币现金中国人保中国平安等7家单位被央行处罚随着互联网时代持续发展,互联网终端设备金融机构被有效地联合起来,形成了一个新型的支付体系移动支付,开创了新的支付方式,使电子货币开始普及。根据中国银联发布的2020移动支付安全大调真假工程机?小米12Ultra现身二手平台丨荣耀子品牌来了,叫星耀前不久有消息称台积电代工的8Gen1将于本月中下旬发布,搭载这款芯片的小米12Ultra也是目前很多网友关心的机型之一,今天,海鲜市场上出现了某品牌12Ultra工程机的商品。后置48亿元资金险被冻结,小米印度保卫战出海印度还是一个好的选择吗?文中国企业家记者赵东山编辑李薇头图摄影邓攀AreyouOK?2015年,小米创始人雷军在小米印度新品发布会上向用户喊出这句英语时,可能没想到小米在印度会小米12Ultra正式上产线,预计月底量产搭载2k120hz高刷屏据博主数码闲聊站称,SM8475影像旗舰机和SM7475换芯机正式上产线了,预计月底进入量产阶段。这两款旗舰机都是2k120hzltpo高刷大屏,5000万像素超级大底和超大底,新5000mAh电池小米12Ultra曝光,小米11无奈下跌,怎能不黯然神伤曝顶级配置硬刚iPhone14的小米12Ultra巅峰之作将搭载第二代LTPO技术,曝顶级配置硬刚iPhone14的小米12Ultra巅峰之作支持2K120Hz屏幕刷新率。曝顶级配瑞银下调小米首季经调整纯利预测至28亿元收入预测升至699亿元瑞银发表报告,将小米首季收入预测由695亿元上调至699亿元,经调整纯利预测由41亿元下调至28亿元。智能手机出货量预测由4,080万部微调至4,000万部。瑞银认为,首季业绩会反