Как проверить [TDD], если конкретная запись уже существует в базе данных - PullRequest
0 голосов
/ 18 января 2019

Я новичок в C # и узнаю о TDD. Я вижу использование поддельных объектов, но я застрял в течение нескольких дней в поисках чего-то похожего на то, что я делаю, и я ничего не нашел.

Мое первое правило для модульного тестирования состоит в том, что не должно существовать двух конкретных объектов с одинаковым свойством.

Я приведу вам пример: допустим, что объект - студент, и у меня не может быть двух лидеров, поэтому мой тест для новичка - это что-то вроде создания двух студентов и назначения их в качестве лидеров. Когда я сохраню секундант, я возьму исключение или что-то в этом роде.

Что ж, TDD - это еще не проект данных, и макеты предназначены только для эмуляции одного объекта (если я правильно понял концепцию) ... так ... как эмулировать базу данных, чтобы я мог проверить, есть ли Лидер, прежде чем упорствовать, или даже создать ученика или назначить ученика лидером. Или есть лучший способ сделать это?

Большое спасибо !!!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Лично я бы не стал тестировать реализацию базы данных. Я бы настроил базу данных, чтобы убедиться, что столбец задан как уникальный, и пусть база данных выполняет свою работу.

Это, как говорится, если вы хотите проверить, что вы ловите свою уникальность в абстракции базы данных. Вы должны настроить реализацию интерфейса с несколькими элементами, два из которых являются неуникальными, и убедиться, что вы их поймали.

* 1005 например *

public interface IPersonRepository
{
    void AddPerson(Person person);
    IEnumerable<Person> GetPeople();
}

public class PersonService
{
    private static readonly IPersonRepository _repo;

    public PersonService(IPersonRepository repo)
    {
        _repo = repo;
    }

    public void AddPerson(Person person)
    {
        var people = _repo.GetPeople();
        if(people.Select(p=>p.LastName).Contains(person.LastName))
        {
             // person exists
        }
        _repo.AddPerson(person);
    }
}


public class PersonServiceTests
{
     public void ShouldNotAddPersonIfExists()
     {
         var mockRepo = new Mock<IPersonRepository>();
         mockRepo.Set(r => r.GetPeople()).Returns(new[]{new Person(firstName, lastName), new Person(otherName, lastName));

         var service = new PersonService(mockRepo.Object);

         /// try add and check assertions or exceptions thrown
     }
}
0 голосов
/ 18 января 2019

Вам нужно высмеивать все, включая слой вашей базы данных.Если вы обращаетесь к своей базе данных через экземпляр IRepository, то вы должны создать что-то вроде этого:

 public interface IRepository
 {
     List<Student> GetAllStudents();
     void AddStudent(Student student);
     Teacher GetStudentTeacher(int studentId);
 }

 public class MockRepository : IRepository
 {
     public static List<Student> Students { get; set; }
     public static List<Teachers> Teachers { get; set; }

     static MockRepository()
     {
         Students = new List<Student>();
     }

     public List<Student> GetAllStudents()
     {
         return Students.ToList();
     }

     public void AddStudent(Student student)
     {
         Students.Add(student);
     }

     public Teacher GetStudentTeacher(int studentId)
     {
         var student = Students.FirstOrDefault(s => s.Id == studentId);
         if (student != null)
         {
             return Teachers.FirstOrDefault(t => t.Id == student.TeacherId);
         }

         return null;
     }
 }

Верхний уровень может быть ответственным за создание исключения в случае, если у ученика уже есть учитель, и есть попытка добавитьвторой.

...