Solution for Lead OPA test error ( add button clicked after cancel button )
改了Lead后遇到OPA的test failure:
問題的表現是我們的test code里點了cancel button之后,再點Add button,這行語句報錯:在dialog里找不到這個期望的product
我會把這個問題的分析思路寫到github上。
找不到item的原因是因為dialog根本就沒有render-> dialog render是通過fragment.open實現的。
在引起OPA fail的上一行語句,add button會call Dialog.open,但是此時open沒有真正執行,因為line 415就已經返回了。
[外鏈圖片轉存失敗(img-YJw9CIAP-1568814912233)(https://user-images.githubusercontent.com/5669954/32261668-10062408-bf0b-11e7-8ccd-aec1510a3260.png)]
為什么之前Cancel button已經調用了Popup.close,但是 隨后Open的時候isOpen仍然返回true?
[外鏈圖片轉存失敗(img-Vy4zVc0z-1568814912234)(https://user-images.githubusercontent.com/5669954/32261671-10d4ea0e-bf0b-11e7-99f0-47f96cd17ad9.png)]
只有在210毫秒之后,popup的bOpen才會置為false,狀態才會置為CLOSED. 但是我們隨后的Add button click發生在這210毫秒之前,因此此時dialog的bOpen還為true,因此第二次Add button的執行并不能打開Dialog。
[外鏈圖片轉存失敗(img-UI2ofEti-1568814912235)(https://user-images.githubusercontent.com/5669954/32261672-11094312-bf0b-11e7-846b-1d83198a59a0.png)]
Solution
第一種改法:
Product.js 做如下修改,這樣每次點擊add button會生成新的Dialog instance,避免了share同一個instance導致的問題。每次對oAddProductsFragment 賦上新的instance,之前的instance引用計數為0會被瀏覽器自動回收,不會出現內存泄露。我們Lead 代碼里也沒有任何地方需要顯式通過”addProducts” id來引用這個dialog,所以這個改法可行。
[外鏈圖片轉存失敗(img-CoZLlwqZ-1568814912235)(https://user-images.githubusercontent.com/5669954/32261673-113cd204-bf0b-11e7-8901-ac865e13fca1.png)]
我測試通過:
[外鏈圖片轉存失敗(img-1IoENtgO-1568814912236)(https://user-images.githubusercontent.com/5669954/32261674-1171cdce-bf0b-11e7-892f-c1340ec8af75.png)]
第二種改法:
[外鏈圖片轉存失敗(img-5mHhv4wI-1568814912236)(https://user-images.githubusercontent.com/5669954/32261660-0e92c2a2-bf0b-11e7-9719-e3c70c16c630.png)]
在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,感覺有點本末倒置。
[外鏈圖片轉存失敗(img-1SkP7QOl-1568814912237)(https://user-images.githubusercontent.com/5669954/32261661-0ec950ce-bf0b-11e7-9d24-db9ed2440d1f.png)]
第四種改法:
以上三種方法都需要修改我們的應用代碼。我在想有沒有一種方法能夠只修改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就沒有動畫效果了。
附件是延時為210毫秒和0毫秒的cancel 效果,大家看看肉眼能不能看出差別。
第四種解法的思路很簡單,既然dialog的cancel是duration 210毫秒的動畫效果,那么OPA代碼里我只要保證OK button的點擊是在這個cancel動畫結束之后再執行就行了。用setTimeout將這個點擊事件加到queue里,300毫秒后執行。
這種方法只用改OPA代碼,可以作為最后的solution,現在OPA就能過了。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
總結
以上是生活随笔為你收集整理的Solution for Lead OPA test error ( add button clicked after cancel button )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩托罗拉Edge 40现身FCC和TRD
- 下一篇: 今年内上市 比亚迪B级纯电猎装SUV宋L