Benutzerdefinierte Regeln
Mit der Funktion „Benutzerdefinierte Regeln“ können Sie neue Regeln erstellen, um diese zu testen und wichtige Verhaltensweisen innerhalb bestehender Regeln zu ändern.
Erstellen wir eine benutzerdefinierte Regel, die das Name-Attribut einer Ansicht überprüft. Die Ergebniskriterien lauten wie folgt:
- Nicht zutreffend: Der Name ist null
- Fehler: Der Name ist nicht null, sondern leer
- Erfolg: Der Name ist nicht null und hat eine gewisse Länge
Erstellen der Regel
-
Richten Sie ein neues Klassenobjekt ein, das von
AxeRule
erbt. Innerhalb des Initialisierers können Sie die Regelkonfiguration so einrichten, dass Folgendes angegeben wird:- Nach welchem Standard testen Sie
- Die Auswirkungen
- Eine Zusammenfassung der Regel
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) } }
-
Als Nächstes müssen Sie die zu testenden Eigenschaften der Ansicht erfassen. Für unser Beispiel müssen wir auf die name Eigenschaft zugreifen.
override func collectProps(for node: AxeView) -> AxeProps {
let axeProps = AxeProps()
axeProps.add([
.name: node.name
])
return axeProps
}
- Zuletzt geben wir in der
runRule
Funktion an, was wir testen, um festzustellen, ob die Regel erfolgreich war, fehlgeschlagen ist oder als nicht anwendbar betrachtet wird.
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
}
}
Zu axe DevTools hinzufügen
Nachdem Sie die Logik für Ihre benutzerdefinierte Regel geschrieben haben, fügen Sie sie der Liste der Regeln hinzu, die axe DevTools kennt, indem Sie die Konfiguration anpassen. Sie sollten Konfigurationen festlegen, bevor Tests ausgeführt werden und nach der Authentifizierung.
axe?.configuration.customRules.insert(CustomRule())
Vollständiges Beispiel
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
}
}
}