-1

Я Добавлено Модульное тестирование в существующий проект MVC, а также добавлены ссылкиКак вставить Dependency Injection в MVC проекта

, когда я создать объект контроллера

он бросает исключение из-за DbContext объект контекста я создал в MVC, но мне нужно сделать Dependency Injection и издеваться, чтобы он не проверял его.

пожалуйста, как я могу сделать интерфейс 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 - отличная насмешливая/вспомогательная библиотека. Их пакет nuget, который вы можете добавить в свой тестовый проект, который включает все, что вам нужно. Более подробную информацию см. В документации: http://nsubstitute.github.io/ –

+0

. Я установил ее в своем проекте. Какие дальнейшие шаги, пожалуйста, объясните подробно. –

1

Вы должны либо абстрагировать ApplicationDbContext с помощью интерфейса, как IAppDbContext, либо предоставить строку подключения для проекта тестирования. В последнем случае ваш тест перестанет быть модульным тестом.

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, что должно быть объявлено –