Reglas personalizadas
La función de reglas personalizadas le permite crear nuevas reglas para probar y cambiar comportamientos clave dentro de las reglas existentes.
Creemos una regla personalizada que compruebe la propiedad 'nombre' de una vista. Los criterios de resultado serán los siguientes:
- No aplicable: el nombre es nulo
- Error: el nombre no es nulo sino que está vacío
- Éxito: el nombre no es nulo y tiene cierta longitud
Creación de la regla
-
Configurar un nuevo objeto de clase que herede de
AxeRule
. Dentro del inicializador, puede configurar la regla para especificar lo siguiente:- ¿Contra qué estándar estás haciendo la prueba?
- El impacto
- Un resumen de la regla
class CustomRule: AxeRule { public init() { let ruleConfiguration = RuleConf(standard: AxeStandard.BEST_PRACTICE, impact: AxeImpact.MODERATE, summary: "Asserts that when name is present it is not empty.") super.init(ruleConf: ruleConfiguration) } }
-
A continuación, deberá recopilar las propiedades de la vista para probarla. Para nuestro ejemplo, necesitamos acceder a la propiedad name.
override func collectProps(for node: AxeView) -> AxeProps {
let axeProps = AxeProps()
axeProps.add([
.name: node.name
])
return axeProps
}
- Por último, especificaremos en la función contra qué estamos probando para determinar si la regla tuvo éxito, falló o se considera inaplicable.
runRule
override func runRule(_ props: AxeProps) throws -> AxeStatus {
guard let name = props.get(.name, withType: String.self) else { return .INAPPLICABLE }
if !name.isEmpty {
return AxeStatus.PASS
} else {
return AxeStatus.FAIL
}
}
Agregar a Axe DevTools
Una vez que haya escrito la lógica para su regla personalizada, agréguela a la lista de reglas que axe DevTools conoce ajustando la configuración. Debes establecer las configuraciones antes de ejecutar cualquier prueba y después de la autenticación.
axe?.configuration.customRules.insert(CustomRule())
Ejemplo completo
class CustomRule: AxeRule {
public init() {
let ruleConfiguration = RuleConf(standard: AxeStandard.BEST_PRACTICE,
impact: AxeImpact.MODERATE,
summary: "Asserts that when name is present it is not empty.")
super.init(ruleConf: ruleConfiguration)
}
override func collectProps(for node: AxeView) -> AxeProps {
let axeProps = AxeProps()
axeProps.add([
.name: node.name
])
return axeProps
}
override func runRule(_ props: AxeProps) throws -> AxeStatus {
guard let name = props.get(.name, withType: String.self) else { return .INAPPLICABLE }
if !name.isEmpty {
return AxeStatus.PASS
} else {
return AxeStatus.FAIL
}
}
}