2016-01-14 3 views
0

У меня есть приложение, которое позволяет вам добавлять данные о студентах и ​​преподавателях, а также искать их и отображать их и т. Д. Это для задания в колледже, и я должен проверить пять из них методы, которые я создал. Во-первых, я не уверен, как тестировать метод с использованием строк, так как все методы тестирования, которые я видел, связаны с приложением для банковского счета, а тестирование методов снятия и депозита кажется простым, так как вам просто нужно добавлять и вычитать цифры. Я совсем не уверен, как проверить мой метод (например) AddLecturer(). Я попытался получить один из методов для исключения исключений, если класс статуса, который я создал, введен правильно, но программа по-прежнему считает это необработанным исключением. Как исправить исключение, чтобы оно обрабатывалось правильно, и как я могу проверить эти другие методы?Как проверить методы, связанные с строками в C#

Вот основная точка входа в приложение со всеми методами.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DBSManagement 
{ 
    public class College: Staff 
    { 
     public static List<Student> students = new List<Student>(); 
     public static List<Lecturer> lecturers = new List<Lecturer>(); 

     public static void Main() 
     { 
      int choice; 
      bool seeAgain = true; 

       do 
       { 
        Console.WriteLine("Press"); 
        Console.WriteLine("1: To add a student"); 
        Console.WriteLine("2: To add a lecturer"); 
        Console.WriteLine("3: To search for a lecturer or student"); 
        Console.WriteLine("4: To show the details of all enrolled students"); 
        Console.WriteLine("5: To show the names of all lecturers"); 
        Console.WriteLine("6: To show payroll details for a lecturer"); 
        Console.WriteLine("7: To quit"); 
        int.TryParse(Console.ReadLine(), out choice); 

        switch (choice) 
        { 
         case 1: 
          AddStudent(); 
          break; 
         case 2: 
          AddLecturer(); 
          break; 
         case 3: 
          SearchPerson(); 
          break; 
         case 4: 
          ShowStudents(); 
          break; 
         case 5: 
          ShowLecturers(); 
          break; 
         case 6: 
          ShowPayrollDetails(); 
          break; 
         case 7: 
          seeAgain = false; 
          break; 
         default: 
          Console.WriteLine("Invalid option selected"); 
          break; 
        } 
       } while (seeAgain); 
      } 
     public static void AddStudent() 
     { 
      Student student = new Student(); 
      Console.WriteLine("Enter student name:"); 
      if (Console.ReadLine() != null) 
      { 
       student.Name = Console.ReadLine(); 
      } 
      else throw new ArgumentNullException("Please enter a name"); 

      Console.WriteLine("Enter student address:"); 
      student.Address = Console.ReadLine(); 
      Console.WriteLine("Enter student phone number:"); 
      student.Phone = Console.ReadLine(); 
      Console.WriteLine("Enter student email:"); 
      student.Email = Console.ReadLine(); 
      Console.WriteLine("Enter student PPSN:"); 
      student.PPSN = Console.ReadLine(); 
      Console.WriteLine("Enter student status (postgrad or undergrad):"); 
      EnterStat: 
       string stat = Console.ReadLine().ToLower(); 
       if (stat == "postgrad" || stat == "undergrad") 
       { 
        student.Status = (Status)Enum.Parse(typeof(Status), stat); 
       } 
       else 
       { 
        Console.WriteLine("Please enter either postgrad or undergrad:"); 
        goto EnterStat; 
       } 
      Console.WriteLine("Enter student ID:"); 
      int inStudentID; 
      int.TryParse(Console.ReadLine(), out inStudentID); 
      student.StudentID = inStudentID; 
      students.Add(student); 
     } 

     public static void AddLecturer() 
     { 
      Lecturer lecturer = new Lecturer(); 
      Console.WriteLine("Enter lecturer name:"); 
      lecturer.Name = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer address:"); 
      lecturer.Address = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer phone number:"); 
      lecturer.Phone = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer email:"); 
      lecturer.Email = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer PPSN:"); 
      lecturer.PPSN = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer ID:"); 
      lecturer.ID = Console.ReadLine(); 
      Console.WriteLine("Enter salary:"); 
      lecturer.Salary = decimal.Parse(Console.ReadLine()); 
      Console.WriteLine("Enter subject taught:"); 
      lecturer.SubjectTaught = Console.ReadLine().ToLower(); 
      lecturers.Add(lecturer); 
     } 

     public static void SearchPerson() 
     { 
      int searchChoice = 0; 
      int studentSearch = 0; 
      int lecturerSearch = 0; 
      Console.WriteLine("Press:"); 
      Console.WriteLine("1 to search for a student"); 
      Console.WriteLine("2 to search for a lecturer"); 
      int.TryParse(Console.ReadLine(), out searchChoice); 

      switch (searchChoice) 
      { 
       //search students 
       case 1: 
        Console.WriteLine("Press:"); 
        Console.WriteLine("1 to search by name"); 
        Console.WriteLine("2 to search by student number"); 
        int.TryParse(Console.ReadLine(), out studentSearch); 

        switch (studentSearch) 
        { 
         case 1: 
          Console.WriteLine("Enter student name:"); 
          string studentNameSearch = Console.ReadLine(); 
          bool sFound = false; 
          foreach (Student student in students) 
          { 
           if (student.Name.Contains(studentNameSearch)) 
           { 
            Console.WriteLine(student.ToString()); 
            sFound = true; 
            break; 
           } 
          } 
          if (sFound == false) 
          { 
           Console.WriteLine("Student name not found"); 
          } 
          break; 

         case 2: 
          int studentIDSearch; 
          bool IDFound = false; 
          Console.WriteLine("Enter student number:"); 
          int.TryParse(Console.ReadLine(), out studentIDSearch); 
          foreach (Student student in students) 
          { 
           if (student.StudentID.Equals(studentIDSearch)) 
           { 
            Console.WriteLine(student.ToString()); 
            IDFound = true; 
            break; 
           } 
          } 
          if (IDFound == false) 
          { 
           Console.WriteLine("Student name not found"); 
          } 
          break; 

         default: 
          Console.WriteLine("Invalid option selected"); 
          break; 
        } 
        break; 
       //search lecturers 
       case 2: 
        Console.WriteLine("Press:"); 
        Console.WriteLine("1 to search by name"); 
        Console.WriteLine("2 to search by course taught"); 
        int.TryParse(Console.ReadLine(), out lecturerSearch); 

        switch (lecturerSearch) 
        { 
         case 1: 
          Console.WriteLine("Enter lecturer name:"); 
          string lecturerNameSearch = Console.ReadLine(); 
          bool lFound = false; 
          foreach (Lecturer lecturer in lecturers) 
          { 
           if (lecturer.Name.Contains(lecturerNameSearch)) 
           { 
            Console.WriteLine(lecturer.ToString()); 
            lFound = true; 
            break; 
           } 
          } 
          if (lFound == false) 
          { 
           Console.WriteLine("Lecturer name not found"); 
          } 
          break; 

         case 2: 
          Console.WriteLine("Enter course taught:"); 
          string lecturerSubjectSearch = Console.ReadLine().ToLower(); 
          bool subjectFound = false; 
          foreach (Lecturer lecturer in lecturers) 
          { 
           if (lecturer.SubjectTaught.Contains(lecturerSubjectSearch)) 
           { 
            Console.WriteLine(lecturer.ToString()); 
            subjectFound = true; 
            break; 
           } 
          } 
          if (subjectFound == false) 
          { 
           Console.WriteLine("Subject not found"); 
          } 
          break; 

         default: 
          Console.WriteLine("Invalid option selected"); 
          break; 
        } 
        break; 

       default: 
        Console.WriteLine("Invalid option selected"); 
        break; 
      } 
     } 

     public static void ShowStudents() 
     { 
      //sort list by name 
      List<Student> SortedStudents = students.OrderBy(o => o.Name).ToList(); 

      foreach (Student student in SortedStudents) 
      { 
       Console.WriteLine(student); 
      } 
     } 

     public static void ShowLecturers() 
     { 
      //sort list by name 
      List<Lecturer> SortedLecturers = lecturers.OrderBy(o => o.Name).ToList(); 

      foreach (Lecturer lecturer in SortedLecturers) 
      { 
       Console.WriteLine(lecturer.Name); 
      } 
     } 

     public static void ShowPayrollDetails() 
     { 
      Console.WriteLine("Enter lecturer name:"); 
      string lecturerNameSearch = Console.ReadLine(); 
      for (int i = 0; i < lecturers.Count; i++) 
      { 
       if (lecturers[i].Name == lecturerNameSearch) 
       { 
        Console.WriteLine(lecturers[i].PayrollDetails()); 
       } 
       else 
       { 
        Console.WriteLine("Lecturer name not found"); 
       } 
      } 
     } 
    } 
} 

Вот те методы испытаний, которые я создал до сих пор.

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using DBSManagement; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DBSManagement.Tests 
{ 
    [TestClass()] 
    public class CollegeTests 
    { 
     [TestMethod()] 
     [ExpectedException(typeof(ArgumentException))] 
     public void AddStudentTest() 
     { 
      //arrange 
      string s = "student"; 
      Status status = (Status)Enum.Parse(typeof(Status), s); 
      //act 
      Student student1 = new Student("Name", "123 Fake St", "0851234567", "[email protected]", "7895459R", status, 12345678); 
      //assert 
      //handled by exception 
     } 

     [TestMethod()] 
     public void AddLecturerTest() 
     { 
      Assert.Fail(); 
     } 

     [TestMethod()] 
     public void SearchPersonTest() 
     { 
      Assert.Fail(); 
     } 

     [TestMethod()] 
     public void ShowStudentsTest() 
     { 
      Assert.Fail(); 
     } 

     [TestMethod()] 
     public void ShowLecturersTest() 
     { 
      Assert.Fail(); 
     } 

     [TestMethod()] 
     public void ShowPayrollDetailsTest() 
     { 
      Assert. 

Это класс студента. Я пытаюсь сделать это исключение, если кто-либо войдет в статус, отличный от постграда или undergrad. Это перечисления.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DBSManagement 
{ 
    public class Student : Person 
    { 
     private Status status; 
     //auto-implemented properties 
     public Status Status 
     { 
      get 
      { 
       return status; 
      } 
      set 
      { 
       if (value == Status.undergrad || value == Status.postgrad) 
       { 
        status = value; 
       } 
       else throw new ArgumentException("Error: please select undergrad or postgrad"); 
      } 
     } 
     public int StudentID { get; set; } 

     //empty constructor 
     public Student() { } 

     //constructor with parameters 
     public Student(string name, string address, string phone, string email, string ppsn, Status status, int studentId) 
      :base(name, address, phone, email, ppsn) 
     { 
      Status = status; 
      StudentID = studentId; 
     } 

     //overridden ToString() method 
     public override string ToString() 
     { 
      return string.Format("Name: {0}\nStudent Number: {1}\nAddress: {2}\nPhone: {3}\nEmail: {4}\nStatus: {5}", 
       Name, StudentID, Address, Phone, Email, Status); 
     } 
    } 
} 
+2

Вы не можете (легко) взаимодействий тест UI, как правило, чтобы сделать тестирование проще абстрагироваться все взаимодействия с пользовательским интерфейсом через [службу взаимодействия] (https://msdn.microsoft.com/en-us/library/gg405494 (v = pandp.40) .aspx # sec11). Хотелось бы, я не понимаю, что относительно 'AddLecturer' вы могли бы на самом деле« Проверить ». Предполагается, что тесты доказывают, что что-то верно, какой факт должен доказать «AddLecturerTest»? –

+0

Это в значительной степени то, о чем я думал. Тем не менее, это 25% баллов за это проклятое задание. Я думаю, она хочет, чтобы мы делали эти методы броскими пользовательскими исключениями. Который я пытался сделать, но они разбивают программу. –

+1

Какой метод вы делали для исключения? Можете ли вы поделиться кодом, который это делает? – Martin

ответ

1

Вы можете проверить свой код, но эти тесты будут очень хрупки (и, как отметил @Scott Чемберлен, это не будет ясно, что они будут доказывать).

Что вам нужно сделать, так это «спрятать» это уродливое Console.ReadLine() за чем-то, что у вас есть «программный» контроль. Func<string> бы идеально:

public static void AddStudent(Func<string> consoleReader) 
{ 
    Student student = new Student(); 

    Console.WriteLine("Enter student name:"); 
    student.Name = Console.ReadLine(); 
    // ...   
} 

С этим, тесты становятся чем-то вроде:

[Test] 
void TestAddStudent() 
{ 
    var n = 0; 
    var strings = new[] { 
     "Name", 
     "123 Fake St", 
     "0851234567", 
     "[email protected]", 
     "7895459R", 
     // ... 
    }; 

    Func<string> consoleReader =() => strings[n++]; 

    var student = AddStudent(consoleReader); 

    Assert.AreEqual(strings[0], student.Name); 
    // ... 
} 
+0

Спасибо за помощь. Я не знаком с этой техникой. Я попробовал, и мой оператор switch теперь запрашивает параметр AddStudent(). –

1

Если вы хотите, чтобы сделать тестирование было бы проще, если отделить интерфейс от логики. Например, вы можете использовать шаблон MVC или что-то в этом роде. Начните с создания всех ваших объектов данных, таких как Lecturer, Student и т. Д. Эти объекты будут вашей моделью данных. Затем добавьте логику или элементы управления, которые управляют этими объектами данных. В контрольном компоненте может быть метод AddLecturer(..). Наконец, создайте пользовательский интерфейс или представление, которое взаимодействует с ними, не будучи полностью переплетающимся, как в вашем коде. Что касается тестирования, вы в основном будете писать тесты для методов в компонентах управления и, возможно, в модели. Есть много вещей для тестирования. Возьмите свой дополнительный лектор метод:

  • Это имя длиннее 3 символов?
  • Есть ли хотя бы два имени? (Может быть, это слишком сильное предположение?)
  • Правильно ли отформатирован номер телефона?
  • Является ли электронное письмо правильно отформатированным?
  • Является ли только идентификатор лектора? (Хотя, я бы ожидал, что идентификатор лектора будет создан вашей системой)
  • Является ли PPSN хорошо отформатированным?
  • Является ли зарплата положительной?
  • Является ли зарплата нелепо большим количеством?
  • Является ли зарплата даже номером?`
  • При добавлении нового лектора в lecturers действительно ли он был добавлен? (Как правило, вы никогда не проверить это. Мы верим в основные коллекции, если вы не написали сами.)
  • т.д.
+0

Большое спасибо. Я не слишком хорошо знаком с MVC, кроме маленького кода CodeIgniter, который я изучил. Я не уверен, как реализовать эти тесты. То, как я убедился, что человек добавляет «postgrad» или «undergrad», был с помощью инструкции if в классе колледжа, но так, как я это делал, невозможно добавить неверный ввод, поэтому исключение и тест никогда не срабатывают. Как реализовать эти ограничения таким образом, чтобы можно было добавлять неверные данные, а затем проверить их? –

Смежные вопросы