2013-09-13 3 views
8

У меня есть решение, называемое MvcContacts с проектом MVC 4 имени MvcContacts и проект модульного тестирования имени MvcContacts.Test (создается автоматически, когда я проверил «включить модульного тестирования» . окно в Visual StudioМодульное тестирование с Ninject в MVC 4

Я установил пакет Ninject.MVC NuGet в MvcContacts (проект MVC)

Я последовал this tutorial и у меня есть все установки без каких-либо ошибок, и он должен работать нормально;. как когда-либо, мой модульного тестирования проекта MvcContacts.Test есть ошибки, как это:

«MvcContacts.Controllers.HomeController» не содержит конструктор, который принимает аргументы 0

Это мой HomeController:

namespace MvcContacts.Controllers 
{ 
    public class HomeController : Controller 
    { 
     Logging.ILogger _logger; 

     public HomeController(Logging.ILogger logger) 
     { 
      _logger = logger; 
     } 

     public ActionResult Index() 
     { 
      ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

      _logger.LogMessage(ViewBag.Message); 

      return View(); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your app description page."; 

      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 

      return View(); 
     } 
    } 
} 

Это мой HomeControllerTest:

namespace MvcContacts.Tests.Controllers 
{ 
    [TestClass] 
    public class HomeControllerTest 
    { 
     [TestMethod] 
     public void Index() 
     { 
      // Arrange 
      HomeController controller = new HomeController(); // error on this line 

      // Act 
      ViewResult result = controller.Index() as ViewResult; 

      // Assert 
      Assert.AreEqual("Modify this template to jump-start your ASP.NET MVC application.", result.ViewBag.Message); 
     } 

     [TestMethod] 
     public void About() 
     { 
      // Arrange 
      HomeController controller = new HomeController(); // error on this line 

      // Act 
      ViewResult result = controller.About() as ViewResult; 

      // Assert 
      Assert.IsNotNull(result); 
     } 

     [TestMethod] 
     public void Contact() 
     { 
      // Arrange 
      HomeController controller = new HomeController(); // error on this line 

      // Act 
      ViewResult result = controller.Contact() as ViewResult; 

      // Assert 
      Assert.IsNotNull(result); 
     } 
    } 
} 

Как я могу выполнить проект по тестированию модуля с помощью Ninject?

ответ

10

Вам необходимо передать экземпляр Logging.ILogger вашему конструктору в вашем модульном тесте. Вы можете либо новый вверх экземпляр некоторого типа, который реализует Logging.ILogger, или вы могли бы использовать библиотеку как Moq создать макет экземпляра:

var mockLogger = new Moq.Mock<Logging.ILogger>(); 
var controller = new HomeController(mockLogger.Object); 

В качестве альтернативы, можно добавить конструктор по умолчанию для вашего HomeController:

public HomeController() { _logger = new /* create logger */; } 

Редактировать

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

var module = new /* your module, or a test module which configures mocks */; 
var kernel = new StandardKernel(module); 
var controller = kernel.Get<HomeController>(); 

Вы также можете использовать MockingKernel расширение для Ninject, если вы хотите, чтобы некоторые действительно волшебный укол, но это почти наверняка избыточна для этой ситуации.

+0

Спасибо Я попробую это, но если мне придется вручную разрешить зависимость, то что хорошего - это Ninject? Я думал, что одним из основных преимуществ Ninject было то, что он помогает в модульном тестировании. – user1477388

+1

@ user1477388, используя инверсию шаблонов управления/зависимостей, упрощает модульный тест, но если ваш единичный тест настолько сложный, что вам нужно использовать свой контейнер IoC (Ninject) для настройки зависимостей, тогда ваши модульные тесты могут быть ТОО сложный. В модульном тесте * ideal * используется только один «реальный» экземпляр (например, 'HomeController') со всеми другими зависимостями, предоставляемыми как mocks. –

+2

@SteveRuble: Если у вас нет слоев зависимостей. Если мне нужно высмеять класс A для ввода в класс B, который затем вводится в класс C, вам все равно придется тестировать класс C * как-то *, что означает разрешение зависимостей вручную или использование чего-то типа Ninject. Конечно, все, кроме C, было бы насмешкой, но вам все равно нужно вводить эти издевательства. –

Смежные вопросы