2015-06-08 4 views
1

Привет Я действительно была бы рада, если кто-то может помочь мне с модульного тестирования это бизнес-логики на тест Visual Studio блок ..как проверить эту бизнес-логику

Я Google «под ред» и проверили различные способы но я держу , нахожу модульные тесты для контроллеров, которые мне не нужны. Я был бы самым счастлив, что кто-то может помочь мне узнать, как тестировать этот метод.

Это мой бизнес-класса

public void AddConsultation(ConsultationView cv, int patientid) 
{ 

    using (var deprepo = new ConsultationRepository()) 
    { 
     if (cv.ConsultId == 0) 
     { 
      var curr = DateTime.Now; 
      string date = curr.ToString("d"); 
      string time= curr.ToString("t"); 
      var patient = da.Patients.ToList().Find(x => x.PatientId == patientid); 

      Consultation _consultation = new Consultation 
      { 
       ConsultId = cv.ConsultId, 
       ConsultDate = date, 
       ConsultTime = time, 
       illness = cv.illness, 
       PresribedMed = cv.PresribedMed, 
       Symptoms = cv.Symptoms, 
       U_Id = patient.PatientId, 
      }; 

      deprepo.Insert(_consultation); 
     } 
    } 
} 

Это мой Repository Класс

public class ConsultationRepository:IConsultationRepository 
{ 
    private DataContext _datacontext = null; 
    private readonly IRepository<Consultation> _clinicRepository; 

    public ConsultationRepository() 
    { 
     _datacontext = new DataContext(); 
     _clinicRepository = new RepositoryService<Consultation>(_datacontext); 

    } 

    public Consultation GetById(int id) 
    { 
     return _clinicRepository.GetById(id); 
    } 

    public List<Consultation> GetAll() 
    { 
     return _clinicRepository.GetAll().ToList(); 
    } 

    public void Insert(Consultation model) 
    { 
     _clinicRepository.Insert(model); 
    } 

    public void Update(Consultation model) 
    { 
     _clinicRepository.Update(model); 
    } 

    public void Delete(Consultation model) 
    { 
     _clinicRepository.Delete(model); 
    } 

    public IEnumerable<Consultation> Find(Func<Consultation, bool> predicate) 
    { 
     return _clinicRepository.Find(predicate).ToList(); 
    } 

    public void Dispose() 
    { 
     _datacontext.Dispose(); 
     _datacontext = null; 
    } 
} 
+2

Что именно вы застряли? Это гласит, что вы просто хотите, чтобы кто-то сделал это за вас. Этого не произойдет ... – Liam

+3

Попытайтесь узнать о впрыске зависимостей, инверсии управления и насмешек. Благодаря этому вы сможете тестировать свою бизнес-логику без зависимости от хранилища данных. –

+0

Я новичок в модульном тестировании, я действительно читал о тестировании онлайн, но примеры, которые я получил, предназначены для контроллеров, а не для бизнес-логики. я буду рад, если вы, ребята, можете мне помочь @Liam –

ответ

2

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

//Interface for a factory class 
public interface IFactory 
{ 
    IIConsultationRepository Create(); 
} 

Создание двух заводов, один для испытаний и один для производства

public class MyFactory : IFactory 
{ 
    public IIConsultationRepository Create() 
    { 
     return new ConsultationRepository(); 
    } 
} 

public class MyTestFactory : IFactory 
{ 
    public IIConsultationRepository Create() 
    { 
     return new ConsultationTestRpository(); 
    } 
} 

Создать два репозитория. Один для испытаний и один для производства

public class ConsultationTestRpository : IConsultationRepository 
{ 
    //Your test repository. In this you skip the database. 
    //This is just one simple example of doing it. 
    Consultation _consultation; 
    public Consultation GetById(int id) 
    { 
     return _consultation; 
    } 


    public void Insert(Consultation model) 
    { 
     _consultation = model; 
    } 

} 

public class ConsultationRepository : IConsultationRepository 
{ 
    //Your repository 
} 

Используется для производства

var obj = new TheConsultationClass(new MyFactory()); 

И это для испытания

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var objForTesting = new TheConsultationClass(new MyTestFactory()); 

     var consultationView = new ConsultationView(); 



     objForTesting.AddConsultation(consultationView, 123); 

     var consultation = objForTesting.GetById(...); 

     Assert.AreEqual(123, consultation.U_Id); 
    } 
} 

EDIT

Я забыл показать, как использовать фабрика. Отправить его в качестве параметра конструктору, а затем вызвать Factory.Create()

public class TheConsultationClass 
{ 
    public MyFactory Factory { get; set; } 

    public TheConsultationClass(IFactory factory) 
    { 
     Factory = factory; 
    } 

    public void AddConsultation(ConsultationView cv, int patientid) 
    { 

     using (var deprepo = Factory.Create()) 
     { 
      if (cv.ConsultId == 0) 
      { 
       var curr = DateTime.Now; 
       string date = curr.ToString("d"); 
       string time = curr.ToString("t"); 
       var patient = da.Patients.ToList().Find(x => x.PatientId == patientid); 

       Consultation _consultation = new Consultation 
       { 
        ConsultId = cv.ConsultId, 
        ConsultDate = date, 
        ConsultTime = time, 
        illness = cv.illness, 
        PresribedMed = cv.PresribedMed, 
        Symptoms = cv.Symptoms, 
        U_Id = patient.PatientId, 
       }; 

       deprepo.Insert(_consultation); 
      } 
     } 
    } 
} 
0

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

В своем роде у вашего кода есть некоторые проблемы, которые затрудняют тестирование. Давайте посмотрим на ваш существующий код:

public void AddConsultation(ConsultationView cv, int patientid) 
{ 

В приведенной ниже строке создается новый консультант-репозиторий. Это сложно насмехаться, а это значит, что трудно проверить правильность вызова репозитория. Лучший подход - либо вставить репозиторий, либо завод в класс через его конструктор. Это можно выполнить вручную, как описано в @AxdorphCoder, или вы можете использовать контейнер IOC, например CastleWindsor, или Ninject, чтобы выполнить некоторые тяжелые операции для вас.

using (var deprepo = new ConsultationRepository()) 
    { 
     if (cv.ConsultId == 0) 
     { 

Следующая строка ссылок DateTime.Now. Опять же, это может быть довольно сложно проверить. Опять же, самое простое решение, если вам нужно знать, что используется конкретная дата, - это либо ввести завод для даты, либо ввести эту дату. Альтернативный, если не нужно , что точной является сохранение времени в начале вашего теста, а затем проверка того, что время используется между временем начала теста и временем, когда ваши тестовые утверждения сделаны.

  var curr = DateTime.Now; 
      string date = curr.ToString("d"); 
      string time= curr.ToString("t"); 

Следующая строка ссылок da. Это не инициализируется нигде в приведенном вами образце кода. Похоже, что это еще один репозиторий ... в этом случае стоит совет по поводу внедрения репозитория. Как в стороне, что произойдет, если пациент не найден?

  var patient = da.Patients.ToList().Find(x => x.PatientId == patientid); 

      Consultation _consultation = new Consultation 
      { 
       ConsultId = cv.ConsultId, 
       ConsultDate = date, 
       ConsultTime = time, 
       illness = cv.illness, 
       PresribedMed = cv.PresribedMed, 
       Symptoms = cv.Symptoms, 
       U_Id = patient.PatientId, 
      }; 

      deprepo.Insert(_consultation); 
     } 
    } 
} 

Итак, как бы вы о тестировании метода AddConsultant? Предположим, вы собираетесь следовать за AAA pattern for test arrangement. Вот некоторые тесты вы могли бы написать:

  1. Validate Repository не обновляется Если ConsultId уже установлен

    Arrange - Setup mock repository 
         - setup da.Patients to contain Patient with correct id 
         - Create system under test injecting repository 
         - Create view, with ConsultId <> 0 
    Act  - Call sut.AddConsultation(view, somePationId) 
    Assert - No methods called on injected repository 
    
  2. Validate консультации Создано со значениями из просмотра

    Arrange - Create View to pass, containing consultId = 0 
         - setup da.Patients to contain Patient with correct id 
          Store datetime test started 
          Create mock Repository and set it up to expect a call to insert 
          Create system under test and Inject respository 
    Act  - Call sut.AddConsultation(view, somePationId) 
    Assert - Assert Insert on respository was called with a consultation 
          Assert each property of consulation has expected values from Arrange 
          Assert consultation date is >= Arrange Date and <= Now 
    
  3. Validate, что AddConsultation не работает, если пациент не найден

    Arrange - Create View to pass, containing consultId = 0 
         - setup da.Patients, that doesn't contain Patient with correct id 
          Create mock Repository and set it up to not expect call 
          Create system under test and Inject respository 
    Act  - Call sut.AddConsultation(view, somePationId) 
    Assert - Assert exception thrown with correct information (currently not done) 
    
Смежные вопросы