Estou testando a integração do meu aplicativo ASP.NET Core, especificamente as ações de login, e estou tendo um problema em que ele IPasswordHasher<T>.HashPassword()
está gerando hashes diferentes entre a configuração do meu teste e a execução da ação, e não sei o que fazer a respeito.
Atualmente, meu teste primeiro cria um usuário, faz o hash da senha usando HashPassword(null!, password)
, e então salva no banco de dados e retorna o usuário e a senha sem hash. Então eu pego isso e crio os dados do formulário para dar ao HttpClient para POST para a ação. Tudo isso funciona corretamente, com a única diferença de que quando o usuário é criado antes do teste, o hash que é gerado é diferente do hash que é gerado ao verificar o usuário na ação.
A única coisa que consigo pensar é que, como IPasswordHasher<T>
é uma dependência com escopo, o escopo que crio para criar o usuário antes do teste é diferente do escopo criado para a ação e, portanto, duas instâncias diferentes e possivelmente dois geradores de números aleatórios diferentes para cada instância?
Por enquanto, estou trabalhando em torno disso removendo todos os registros para IPasswordHasher<T>
e registrando-o novamente com minha própria MockPasswordHasher<T>
implementação, que apenas obtém o código hash da senha e o retorna como uma string. Embora isso funcione, isso me deixa cauteloso de que estou me desviando do aplicativo original que está sendo testado porque o que será publicado será diferente e, portanto, talvez meus testes de integração sejam falhos.
internal sealed class MockPasswordHasher<TUser> :
PasswordHasher<TUser>
where TUser : class {
public override string HashPassword(
TUser user,
string password) => password.GetHashCode().ToString();
}
Existe uma maneira adequada de superar isso ou o hash de senha simulado que estou registrando é a melhor maneira?
Depois que @Dai disse que poderia ser por design, dei uma olhada na minha implementação novamente e percebi que pode não estar realmente errado, é só que meu uso de
IPasswordHasher<T>
está errado. Eu estava criando o usuário antes do teste, fazendo hash da senha, salvando no banco de dados e, em seguida, passando as credenciais do usuário para a ação. Tudo isso é bom, mas no manipulador downstream da ação eu estava obtendo a senha e fazendo hash novamente, e então passando isso para a pesquisa do banco de dados, que nunca encontrou o usuário. É aí que está o problema.Percebi que não estou usando o
VerifyPasswordHash()
método no hasher. Então, removi a comparação de hash de senha das consultas do banco de dados e retornei a senha do usuário que estava no banco de dados. Então, passei-a como o hash esperado junto com a senha fornecida para o método de verificação, e funcionou exatamente como esperado.Agora posso remover o hasher de senha simulado, não me preocupar com instâncias e realmente ter confiança em meus testes.
Obrigado @Dai!