Regras Personalizadas
O recurso de regras personalizadas permite que você crie novas regras para testar e alterar comportamentos chave dentro das regras existentes.
Vamos criar uma regra personalizada que verifica a propriedade de nome de uma visualização. Os critérios de resultado serão os seguintes:
- Não aplicável: o nome é nulo
- Falha: o nome não é nulo, mas está vazio
- Sucesso: o nome não é nulo e tem algum comprimento
Criando a Regra
-
Configure um novo objeto de classe que herda de
AxeRule. Dentro do inicializador, você pode configurar a regra para especificar o seguinte:- Qual padrão você está testando
- O impacto
- Um resumo da regra
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) } } -
Em seguida, você precisará coletar as propriedades da visualização para testar. No nosso exemplo, precisamos acessar a propriedade de nome.
override func collectProps(for node: AxeView) -> AxeProps {
let axeProps = AxeProps()
axeProps.add([
.name: node.name
])
return axeProps
}
- Por fim, vamos especificar na função
runRuleo que estamos testando, para determinar se a regra teve sucesso, falhou ou é considerada inaplicável.
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
}
}Adicionar ao axe DevTools
Depois de escrever a lógica para sua regra personalizada, adicione-a à lista de regras conhecidas pelo axe DevTools ajustando a configuração. Você deve definir as configurações antes de qualquer teste ser executado e após a autenticação.
axe?.configuration.customRules.insert(CustomRule())Exemplo 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
}
}
}
