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