Estou trabalhando em um projeto Ruby on Rails e praticando Desenvolvimento Orientado a Testes (TDD) usando o Minitest.
Para autenticação de usuário (usando Devise), escrevi um teste para verificar se um usuário não pode se inscrever sem um e-mail. No entanto, também tenho outros atributos obrigatórios, como first_name, last_name, username e password.
Isso me fez pensar:
- Devo escrever um teste separado para cada atributo ausente?
- Ou testar um atributo ausente é suficiente, já que o Rails já aplica validates :presence, true no nível do modelo?
Outro desenvolvedor sugeriu que se eu tivesse validação de presença para múltiplos atributos, eu também deveria escrever um teste para cada um. O raciocínio deles era que toda funcionalidade implementada deveria ser testada. Eles também sugeriram usar uma abordagem de loop para evitar código redundante em vez de escrever múltiplos testes quase idênticos.
Entendo que, de uma perspectiva TDD, onde eu escrevo o teste primeiro e então escrevo o código para fazê-lo passar, um teste de loop para atributos ausentes me forçaria a implementar validação de presença para cada campo. Isso garante que eu não esqueça um acidentalmente. No entanto, de uma abordagem mais pragmática, ainda me pergunto se esse nível de teste é necessário quando o Rails já impõe validação de presença no nível do modelo.
Adoraria ouvir as melhores práticas aqui: como desenvolvedores Rails experientes abordam isso?
Aqui está o teste que tenho atualmente:
test "user cannot sign up without email" do
post user_registration_path, params: {
user: {
first_name: "Test",
last_name: "User",
username: "testuser",
email: "",
password: "password123",
password_confirmation: "password123",
}
}
assert_response :unprocessable_entity
end