前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solution for Lead OPA test error ( add button clicked after cancel button )

Solution for Lead OPA test error ( add button clicked after cancel button )

作者头像
Jerry Wang
发布2019-06-20 09:18:48
9500
发布2019-06-20 09:18:48
举报

改了Lead后遇到OPA的test failure:

clipboard1
clipboard1

问题的表现是我们的test code里点了cancel button之后,再点Add button,这行语句报错:在dialog里找不到这个期望的product

clipboard2
clipboard2

我会把这个问题的分析思路写到github上。

找不到item的原因是因为dialog根本就没有render-> dialog render是通过fragment.open实现的。 在引起OPA fail的上一行语句,add button会call Dialog.open,但是此时open没有真正执行,因为line 415就已经返回了。

clipboard3
clipboard3

为什么之前Cancel button已经调用了Popup.close,但是 随后Open的时候isOpen仍然返回true?

clipboard4
clipboard4

Debug dialog的close方法就能得到答案:oPopup.close只会将状态置为CLOSING,

clipboard5
clipboard5

然后用延时操作将真正的close动作fnClose放在210毫秒之后执行:

clipboard6
clipboard6

只有在210毫秒之后,popup的bOpen才会置为false,状态才会置为CLOSED. 但是我们随后的Add button click发生在这210毫秒之前,因此此时dialog的bOpen还为true,因此第二次Add button的执行并不能打开Dialog。

clipboard7
clipboard7

Solution

第一种改法: Product.js 做如下修改,这样每次点击add button会生成新的Dialog instance,避免了share同一个instance导致的问题。每次对oAddProductsFragment 赋上新的instance,之前的instance引用计数为0会被浏览器自动回收,不会出现内存泄露。我们Lead 代码里也没有任何地方需要显式通过”addProducts” id来引用这个dialog,所以这个改法可行。

clipboard8
clipboard8

我测试通过:

clipboard9
clipboard9

第二种改法:

clipboard10
clipboard10

在open前面加上判断,抢先把210毫秒之后才会被修改的标志位提前由我们的application 代码自己改掉,这样之后的open能够成功。 但是这样做破坏了UI5的dialog.open和dialog.close的封装性,这些internal的属性bOpen和eOpenState UI5并不想让application touch,将来UI5升到新的版本随时可能修改,而且我也没试过Jenkins build会不会出错。所以这种做法技术可以但不能用在生产代码里。

第三种改法: Debug dialog的close方法发现里面有个分支,如果传入的duration 为0,则真正做close的动作不通过animation来实现,而是立即执行fnClosed。 这种改法也能解决问题,但这样一来就相当于为了test 能通过而adapt了应用的UI behavior,感觉有点本末倒置。

clipboard11
clipboard11

第四种改法:

以上三种方法都需要修改我们的应用代码。我在想有没有一种方法能够只修改OPA 代码,也能让测试通过。

Sent: Friday, 8 July, 2016 2:25 PM

UI5里的cancel点了之后的动画效果是用jQuery的animation实现的,代码里写死的动画效果的duration是210毫秒。

如果用这种解法,我还是能重用dialog fragment instance,只需要用dialog的API setDuration把close的animation设为0,这样close就没有动画效果了。

clipboard12
clipboard12

附件是延时为210毫秒和0毫秒的cancel 效果,大家看看肉眼能不能看出差别。 第四种解法的思路很简单,既然dialog的cancel是duration 210毫秒的动画效果,那么OPA代码里我只要保证OK button的点击是在这个cancel动画结束之后再执行就行了。用setTimeout将这个点击事件加到queue里,300毫秒后执行。

这种方法只用改OPA代码,可以作为最后的solution,现在OPA就能过了。

clipboard13
clipboard13
clipboard14
clipboard14
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Solution
  • Sent: Friday, 8 July, 2016 2:25 PM
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档