Zastanawiam się, czy jest sens testowania jednostkowo próby zapisania / zmiany w DB? Czy to byłaby dobra praktyka? Czy lepiej zrobić to integracyjnie? A poniżej przykład:
Posiadam metodę serwisową która resetuje hasło:
public async Task<bool> ResetPassword(AppUser user, string token, string password)
{
IdentityResult result = await _userManager.ResetPasswordAsync(user, token, password);
if (!result.Succeeded)
{
return false;
}
if (!await UpdateDbWithUser(user))
{
return false;
}
return true;
}
Oczywistą dla mnie jest, że powinienem przetestować scenariusz dla różnych if (!result.Succeeded)
. Jednak nie mam pewności czy powinienem przetestować if (!await UpdateDbWithNewUser(user))
, jeśli:
private async Task<bool> UpdateDbWithUser(AppUser user)
{
try
{
await _userManager.UpdateAsync(user);
return true;
}
catch
{
return false;
}
}
Tutaj korzystam z ORM który powinien sam nadpisać w bazie użytkownika. Z jednej strony po co testować ORM? Z drugiej może być coś nie tak z bazą, więc napisałem taki test:
[Fact]
private async Task ResetPassword_OnUpdateAsyncThrowingException_ReturnsFalse()
{
_userManagerMock.Setup(mock => mock.UpdateAsync(It.IsAny<AppUser>())).ThrowsAsync(new Exception());
bool result = await _service.ResetPassword(new AppUser(), "some_token", "some_password");
Assert.False(result);
}
Ale jak sobie pomyślę, że jak będę try-catch
ował każdą metodę która uderza do DB, to lista testów się podwoi (przesadzając trochę). Co z tym zrobić?