Итак, я немного новичок в этом модульном тестировании, так что, скажем, у меня есть этот код:
public string GenerateToken(TbMtUser user)
{
JWTSettings jwtSettings = _jwtSettingsProvider.GetJWTSettings();
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor()
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Sid, user.CdUser.ToString()),
new Claim(ClaimTypes.Email, user.DsMail),
new Claim(ClaimTypes.Name, user.DsUserName),
}),
Expires = _dateTimeProvider.GetTime().AddMinutes(15),
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtSettings.JWTKey)),
SecurityAlgorithms.HmacSha256),
Issuer = jwtSettings.Issuer,
Audience = jwtSettings.Audience
};
SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
Как видите, я вообще не выкидываю исключения.Однако, скажем, CdUser
- это null
, у объекта null
не может быть метода ToString()
, поэтому будет выдано исключение.
То же самое происходит с DsMail
или DsUsername
при попытке использовать его в Claim
, даже сам user
может быть null
, верно?
Мой вопрос:
Должен ли я сам проверить все эти случаи (например, в начале кода) и выбросить исключения, или я должен просто позволить коду выполнить и передать его другим компонентам внутри этого блока кода?
Я спрашиваю об этом, потому что, если - например - Claim
выдает исключение типа ArgumentNullException
, зачем мне делать что-то вроде:
if (String.IsNullOrEmpty(user.DsMail)) throw ArgumentNullException("DsMail can't be null");
Не было бы то же самоевещь?Что еще более важно, будет ли это необходимо?Единственная мысль, о которой я могу подумать, - это чтобы полностью контролировать происходящее.
Надеюсь, имеет смысл то, что я пытаюсь объяснить.
Я знаю, что это может быть чем-то совершенно неосведомленным с самыми опытными из вас, но что вы думаете?Пожалуйста, поправьте меня.