天天看点

SAP Spartacus的Lock Focus Directive单元测试实现

测试用的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单元测试实现

继续阅读