測試用的HTML頁面:
SAP Spartacus的Lock Focus Directive單元測試實作
SAP Spartacus的Lock Focus Directive單元測試實作 這些方法可以全部mock:
SAP Spartacus的Lock Focus Directive單元測試實作 在beforeEach實作裡,選取每一組的部分子元素,注入到service.findFocusable的傳回結果集裡。
SAP Spartacus的Lock Focus Directive單元測試實作 第一組測試:id為a的a标簽,tabindex應該被設定為0:
SAP Spartacus的Lock Focus Directive單元測試實作 lockFocus directive的預設配置:
SAP Spartacus的Lock Focus Directive單元測試實作 注意shouldLock的标志位是通過config.lock決定的:
SAP Spartacus的Lock Focus Directive單元測試實作 b标簽通過顯式傳入的lock:true,也将tabindex設定為0,這一點同a标簽一樣:
SAP Spartacus的Lock Focus Directive單元測試實作 c标簽:如果顯式地傳入lock:false:
SAP Spartacus的Lock Focus Directive單元測試實作 則host元素的tabindex不發生變化,仍然是初始值5:
SAP Spartacus的Lock Focus Directive單元測試實作 在configuration測試裡,監控event對象的stopPropagation方法,并且讓service的hasFocusableChildren方法傳回false.
SAP Spartacus的Lock Focus Directive單元測試實作
SAP Spartacus的Lock Focus Directive單元測試實作
SAP Spartacus的Lock Focus Directive單元測試實作 顯式觸發a标簽的回車事件:
SAP Spartacus的Lock Focus Directive單元測試實作 注意上圖代碼,在使用代碼觸發a标簽的keydown.enter事件時,也要将mock過後的event對象傳到event handler裡去。
根據lockFocus directive的實作,在handleEnter方法裡會調用event.stopPropagation:
SAP Spartacus的Lock Focus Directive單元測試實作 如果lock=false,則enter事件觸發後,不應該自動被unlock, 單元測試代碼:
SAP Spartacus的Lock Focus Directive單元測試實作 原因在于,如果lock=false,shouldLock也為false,是以無法進入下圖的IF分支。
SAP Spartacus的Lock Focus Directive單元測試實作 子元素的鎖定測試:
SAP Spartacus的Lock Focus Directive單元測試實作 b1,b2, b3應該全部被鎖住,tabindex為-1:
SAP Spartacus的Lock Focus Directive單元測試實作 為什麼要tick(500)?
隻要lock=true,就會自動将autofocus設定為true:
SAP Spartacus的Lock Focus Directive單元測試實作 在view渲染完畢之後,會調用handleFocus:
SAP Spartacus的Lock Focus Directive單元測試實作 handleFocus裡會調用setTimeout執行lockFocus方法:
SAP Spartacus的Lock Focus Directive單元測試實作 b4,b5屬于non-focusable标簽,不應該被lock:
SAP Spartacus的Lock Focus Directive單元測試實作 b4沒有href屬性,b5是p标簽,都不應被鎖住。
SAP Spartacus的Lock Focus Directive單元測試實作 如果lock=false,也不應被lock,tabindex不應該為-1:
SAP Spartacus的Lock Focus Directive單元測試實作 如果child具有persisted focus,那麼不應再lock:
SAP Spartacus的Lock Focus Directive單元測試實作 d1和d2的定義:
SAP Spartacus的Lock Focus Directive單元測試實作 enter事件觸發時,執行unlockFocus方法:
SAP Spartacus的Lock Focus Directive單元測試實作 unlockFocus會将子元素的tabindex設定成0:
SAP Spartacus的Lock Focus Directive單元測試實作
SAP Spartacus的Lock Focus Directive單元測試實作 persist group的測試:
SAP Spartacus的Lock Focus Directive單元測試實作 b1,b2,b3會自動被添加上data-cx-focus-group的屬性,值為config裡傳入的g1:
SAP Spartacus的Lock Focus Directive單元測試實作 b4, b5不是focusable element,是以不應該被設定data-cx-focus-group屬性。
SAP Spartacus的Lock Focus Directive單元測試實作 id為a的a标簽會在escape時觸發service的handleEscape方法:
SAP Spartacus的Lock Focus Directive單元測試實作 如果lock=false,那麼escape時沒必要unlock:
SAP Spartacus的Lock Focus Directive單元測試實作