Как проводить тестирование метода который создает новые объекты работающие с unit of work?
Я пытаюсь создать тест для метода который в процессе работы создает новые объекты.
var result = patientDoctorsSearch.Select(y => new PatientAppointmentDoctor(y.DoctorId)).ToList();
return result;
проблема в том, что для создания объета используется Unit of Work
public class PatientAppointmentDoctor
{
public IUnitOfWork unitOfWork;
public Doctor Doctor { get; set; }
public Specialization Specialization { get; set; }
public PatientAppointmentDoctor(int doctorId)
{
unitOfWork = new UnitOfWork();
Doctor = unitOfWork.Doctors.FindById(doctorId);
Specialization = unitOfWork.Specializations.FindById((int)Doctor.SpecializationId);
}
}
Для тестирования я пытался использовать moсk
Mock<IUnitOfWork> mock = new Mock<IUnitOfWork>();
Mock<EFGenericRepository<Doctor>> mock1 = new Mock<EFGenericRepository<Doctor>>();
mock1.Setup(m => m.Get()).Returns(new List<Doctor>
{
new Doctor(){DoctorId=1,DoctorName="Сергей",DoctorSurname="Аксенов",DoctorPatronymic="Валентинович",DoctorPhone="32423432" },
new Doctor(){DoctorId=2,DoctorName="Олег",DoctorSurname="Валов",DoctorPatronymic="Валентинович",DoctorPhone="32423432" },
new Doctor(){DoctorId=3,DoctorName="Ксения",DoctorSurname="Римова",DoctorPatronymic="Оксановна",DoctorPhone="43242432" }
});
mock.Setup(m => m.Doctors).Returns(mock1.Object);
PatientAppointmentController controller = new PatientAppointmentController() { unitOfWork = mock.Object };
controller.DoctorListViewModel.unitOfWork = mock.Object;
// Действие (act)
List<PatientAppointmentDoctor> patientAppointmentDoctors = controller.DoctorListViewModel.GetPatientAppointmentDoctorsSearch("C", "");
Но как фальшивый unit of work поместить в объект который создается в тестируемом методе?
Ответы (1 шт):
Ваш класс PatientAppointmentDoctor должен не сам создавать UnitOfWork, а принимать его в конструкторе. То есть сигнатура конструктора должна выглядеть примерно так:
PatientAppointmentDoctor(int doctorId, IUnitOfWork unitOfWork)
При этом в модульном тесте появляется возможность создать мок.
Вы используете Moq - это так называемый ограниченный (constrained) изолирующий фреймворк. Так же как и NSubstitute, FakeItEasy.
Есть ещё неограниченные (unconstrained) isolation frameworks. Такие как TypeMock Isolator, JustMock (оба платные) и MS Fakes. Они позволяют замокать практически что угодно. То есть можно либо их применить (но это очень тяжёлая артиллерия), либо сделать правильную архитектуру с инъекцией зависимостей в конструктор.