Основная проблема, которая делает ваш код трудным для тестирования, заключается в том, что этот метод делает слишком много.
Что вы хотите проверить? В самом простом случае вы захотите проверить базовый c счастливый путь , где пользователь вводит правильный пароль (подробнее об этом через минуту) и выводятся правильные данные учетной записи. Вы также захотите проверить «несчастный путь», когда пользователь вводит неверный пароль, и вместо данных учетной записи пользователя отображается сообщение об ошибке.
Еще более усложняется то, что в контексте вашего code, Console.WriteLine
- это сторонняя зависимость, хотя и из надежного источника. В модульном тесте наша цель состоит в том, чтобы выделить единицу работы . Это означает, что вы не хотите вызывать реальный Console.WriteLine
в методе, который вы тестируете модулем. Однако, поскольку Console.WriteLine
является методом c, трудно макетировать , который вы обычно применяете для изоляции единицы работы. Конечно, вы все еще хотите убедиться, что детали, которые будут записаны на экран, соответствуют ожидаемым. Существует несколько подходов к этому, но самый простой, вероятно, состоит в том, чтобы отделить код, который создает пользовательский вывод, от кода, который фактически отображает его .
Другая проблема заключается в том, что этот метод зависит от состояния. в классе Program
(поля myId
, myPass
, myName
и c). В модульном тесте вам нужно контролировать значения, которые вы передаете в эти переменные, и вы не можете сделать это, если они являются c членами вашего Program
класса. Для начала вы можете передать их в свой метод showInfo()
, позволяющий контролировать то, что вы передаете в модульный тест.
Резюме: чтобы сделать этот код тестируемым, вам нужно разбить его на более мелкие компоненты. что вы можете выполнить модульное тестирование индивидуально.
Примечание: ваш .Contains
тест для идентификатора пользователя и пароля выглядит подозрительно, что произойдет, если два человека имеют одинаковый пароль?
Редактировать Вот пример того, как вы можете разбить этот метод на более мелкие методы, которые могут быть индивидуально проверены модулем. Обратите внимание, что в этот код еще можно внести улучшения, но я намеренно оставил этот код очень похожим на код в OP, чтобы было легче проводить сравнения между ними:
public class Class1
{
public void showInfo(
string[] myId,
string[] myPass,
string[] myName,
string[] myAccType,
string[] myDob,
string[] myDomain,
string[] myManager)
{
int indexNum;
string inId = Convert.ToString(Console.ReadLine());//taking Id as input
Console.Write("Enter account Password :");
string inPass = Convert.ToString(Console.ReadLine());//taking password
if (IsPasswordValid(inId, inPass, myId, myPass))
{
var successOutputLines = GetSuccessOutput(
inId,
myId,
myPass,
myName,
myAccType,
myDob,
myDomain,
myManager);
successOutputLines.ToList().ForEach(l => Console.WriteLine(l));
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Login Error!", Console.ForegroundColor);
Console.ResetColor();
}
}
public bool IsPasswordValid(
string userId,
string passwordIn,
string[] userIds,
string[] passwords)
{
var userIndex = Array.IndexOf(userIds, userId);
if (userIndex == -1)
throw new ArgumentException(nameof(userId));
var expectedPassword = passwords[userIndex];
return expectedPassword == passwordIn;
}
public IEnumerable<string> GetSuccessOutput(
string userId,
string[] myId,
string[] myPass,
string[] myName,
string[] myAccType,
string[] myDob,
string[] myDomain,
string[] myManager)
{
var userIndex = Array.IndexOf(myId, userId);
if (userIndex == -1)
throw new ArgumentException(nameof(userId));
var lines = new List<string>();
lines.Add("Login Success!");
lines.Add("Your details: ");
lines.Add("Your details: ");
lines.Add("Name: " + myName[userIndex]);
lines.Add("Id: " + myId[userIndex]);
lines.Add("Acc Type: " + myAccType[userIndex]);
lines.Add("Date of Joining: " + myDob[userIndex]);
lines.Add("Domain: " + myDomain[userIndex]);
lines.Add("Manager: " + myManager[userIndex]);
return lines;
}
}
затем напишите модульные тесты для методов IsPasswordValid
и GetSuccessOutput
.