Règles personnalisées
La fonctionnalité de règles personnalisées vous permet de créer de nouvelles règles à tester et de modifier les comportements clés au sein des règles existantes.
Créons une règle personnalisée qui recherche la propriété de nom d’une vue. Les critères de résultat seront les suivants :
- Non applicable : le nom est nul
- Échec : le nom n'est pas nul mais est vide
- Succès : le nom n'est pas nul et a une certaine longueur
Création de la règle
-
Configurer un nouvel objet de classe qui hérite de
AxeRule
. Dans l'initialiseur, vous pouvez configurer la règle pour spécifier les éléments suivants :- La norme contre laquelle vous testez
- L'impact
- Un résumé de la règle
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) } }
-
Ensuite, vous devrez collecter les propriétés de la vue à tester. Pour notre exemple, nous devons accéder à la propriété name.
override func collectProps(for node: AxeView) -> AxeProps {
let axeProps = AxeProps()
axeProps.add([
.name: node.name
])
return axeProps
}
- Enfin, nous spécifierons dans la fonction ce que nous testons, pour déterminer si la règle a réussi, échoué ou est considérée comme inapplicable.
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
}
}
Ajouter à Axe DevTools
Une fois que vous avez écrit la logique de votre règle personnalisée, ajoutez-la à la liste des règles connues par axe DevTools en ajustant la configuration. Vous devez définir les configurations avant l’exécution de tout test et après l’authentification.
axe?.configuration.customRules.insert(CustomRule())
Exemple complet
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
}
}
}