Как проверить [TDD], если конкретная запись уже существует в базе данных

Если проблема не ограничена, на ранних этапах сопоставления точечных наборов вы мало намекаете на позу.

Глобальные стратегии включают

  • выбор нескольких случайных соответствий , вычисляя соответствующее преобразование и используя его для поиска большего соответствия; оттуда оценить оценку добротности; повторяйте несколько раз и держите лучший результат. [Это принцип RANSAC.]
  • вместо случайного выбора, обнаруживайте «точки признаков», которые проявляют особые свойства, такие как формирование «углов» (в случае кривоподобных облаков) или плотных концентраций. ..; то количество соответствий, подлежащих суждению, значительно уменьшается.
0
задан Adriano Gobbo 18 January 2019 в 18:38
поделиться

2 ответа

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

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

Например,

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
ответ дан Victor Procure 18 January 2019 в 18:38
поделиться

Вам нужно высмеивать все, включая слой вашей базы данных. Если вы обращаетесь к своей базе данных через экземпляр 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;
     }
 }

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

0
ответ дан opewix 18 January 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: