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
Concordo com o que engineersmnky disse no comentário. Se seu modelo tem validações de presença para esses atributos, espera-se que você escreva testes unitários para cada uma das validações nos testes do modelo.
Se você tem um
User
modelo, espero que também tenha umUserTest
como o abaixo:Então, ao testar o fluxo de solicitação, você provavelmente desejará escrever um teste para o cenário de caminho feliz e um teste genérico para um caminho infeliz.
Algo como:
Observe que o teste "Caminho infeliz" aqui é quase idêntico ao da sua pergunta (a única diferença é a descrição do teste). Mas nessa abordagem, um teste infeliz deve ser suficiente. Você não precisa testar se o e-mail deve estar presente para cada usuário, o que você deve testar aqui é se seu controlador está lidando corretamente com o caso em que o usuário pode ser inválido, independentemente do motivo.