-1

나는 기존 MVC 프로젝트에 단위 테스트를 추가하고도 추가 참조 MVC 프로젝트에 의존성 삽입 (Dependency Injection)을 삽입하는 방법

전에서 생성 내가 컨트롤러의 객체를 생성

이 때문에 DBContext 컨텍스트 객체에 예외를 throw

한 MVC하지만 종속성 주입 및 조롱을 수행하여 확인하지 않습니다.

종속성 주입을 수행하기 위해 db 인터페이스를 어떻게 만들 수 있습니까? 테스트 프로젝트에서와 같은 MVC

public class TestingController : Controller 
    { 
     // 
     // GET: /Testing/ 

     ApplicationDbContext db = new ApplicationDbContext(); 

     Random rnd = new Random(); 
     [Authorize] 
     public ActionResult Index() 
     { 
      string uName = User.Identity.GetUserName(); 
      QuestionsViewModel vm = new QuestionsViewModel(); 
      List<AddQuestion> adlist = new List<AddQuestion>(); 
      List<QuestionsViewModel> qlist = new List<QuestionsViewModel>(); 
      List<int> rn = new List<int>(); 
      List<int> rn2 = new List<int>(); 
      List<int> rn3 = new List<int>(); 
      AddQuestion adq = new AddQuestion(); 
      var Sessionid = System.Guid.NewGuid(); 
      vm.sessionid = Sessionid.ToString(); 
      Session["ApplicantSession"] = Sessionid.ToString(); 

      ViewBag.StartTime = Session.Timeout; 


      List<List<int>> threecompQids = new List<List<int>>(); 
      List<int> c1question = db.AddQuestions.Where(x => x.ComplexityLevel == 1) 
       .Select(y => y.AddQuestionID).ToList(); 
      List<int> c2question = db.AddQuestions.Where(x => x.ComplexityLevel == 2) 
       .Select(y => y.AddQuestionID).ToList(); 
      List<int> c3question = db.AddQuestions.Where(x => x.ComplexityLevel == 3) 
       .Select(y => y.AddQuestionID).ToList(); 
      for (int i = 0; i < 5; i++) 
      { 
       int r = rnd.Next(c1question.Min(), c1question.Max() + 1); 
       while (!(c1question.Any(w => w.Equals(r)) && !rn.Any(w => w == r))) 
       { 
        r = rnd.Next(c1question.Min(), c1question.Max() + 1); 
       } 
       rn.Add(r); 
       r = rnd.Next(c2question.Min(), c2question.Max() + 1); 
       while (!(c2question.Any(w => w.Equals(r)) && !rn2.Any(w => w == r))) 
       { 
        r = rnd.Next(c2question.Min(), c2question.Max() + 1); 
       } 
       rn2.Add(r); 
       r = rnd.Next(c3question.Min(), c3question.Max() + 1); 
       while (!(c3question.Any(w => w.Equals(r)) && !rn3.Any(w => w == r))) 
       { 
        r = rnd.Next(c3question.Min(), c3question.Max() + 1); 
       } 
       rn3.Add(r); 

      } 



      var fstquestion = rn[0]; 
      threecompQids.Add(rn); 
      threecompQids.Add(rn2); 
      threecompQids.Add(rn3); 

      vm.ComplexLevQidsLists = threecompQids; 

      adq = db.AddQuestions.Find(fstquestion); 
      List<Option> opt = db.Options.Where(op => op.AddQuestionID == adq.AddQuestionID).ToList(); 
      vm.Questions = adq; 
      vm.Options = opt; 
      vm.UserName = uName; 

      return View(vm); 


     } 

} 

에서

코드는 당신이 당신의 컨트롤러 오른쪽에 의존하지 모의 데이터 액세스 구성 요소를 한 것 같다 testcontroller

+0

코드없이 문제를 어떻게 이해해야합니까? –

+0

이제 코드 –

답변

1

의 객체를 생성 내가? 이 경우 단위 테스트에서 실제 구현을 사용하는 경우 대부분 Test 프로젝트에 정의 된 연결 문자열이 없거나 MVC 프로젝트에 정의 된 연결 문자열과 다릅니다.

컨트롤러의 종속성을 조롱하지 않으면 유닛 테스트가 기술적으로 "유닛"으로 간주 될 수 없다는 것을 명심하십시오. 통합 또는 시나리오 테스트와 같습니다.

+0

을 참조하십시오. 데이터 액세스 구성 요소를 모의하는 방법을 알려주십시오. 내 테스트 프로젝트에 참조가 추가되어야합니다. –

+0

Nsubstitute는 훌륭한 조롱/하위 라이브러리입니다. 이것들은 필요한 모든 것을 포함하는 테스트 프로젝트에 추가 할 수있는 너겟 패키지입니다. 자세한 내용은 여기에 문서를 참조하십시오 : http://nsubstitute.github.io/ –

+0

나는 내 프로젝트에 추가 단계가 무엇인지 자세히 설명해주십시오. –

1

IAppDbContext와 같은 인터페이스를 사용하여 ApplicationDbContext를 추상화하거나 연결 문자열을 테스트 프로젝트에도 제공해야합니다. 후자의 경우에는 테스트가 유닛 테스트가 중단됩니다.

public class MyController: Controller 
{ 
    IAppDbContext _context; 

    pulbic MyController(IAppDbContext context) 
    { 
     _context = context; // Now you can use the interface to perform your data access operations 
    } 

    .... 
} 

이제 단위 테스트에 IAppDbContext 모의 구현을 삽입 할 수 있습니다.

종속성 반전 및 조롱에 대해 조사해야합니다.

+0

ok thanx 나는 연구를 할 것입니다. –

+0

IAppDbContext 인터페이스와 어떤 클래스에서 선언되어야하는지 알려주십시오. 그것으로부터 상속되어야합니다. –

+0

IAppDbContext를 구현했지만, 인터페이스 IAppDbContext에서 무엇을 선언해야하는지 알려주십시오. –

관련 문제