10

我有一个名为 MvcContacts 的解决方案,其中有一个名为MvcContacts的 MVC 4 项目和一个名为MvcContacts.Test的单元测试项目(当我在 Visual Studio 中选中“启用单元测试”框时自动创建

我将 Ninject.MVC NuGet 包安装到MvcContacts(MVC 项目)中。

我按照本教程进行了所有设置,没有错误,它应该可以正常工作;但是,我的单元测试项目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 一起工作?

4

1 回答 1

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 */; }

编辑

如果你想Kernel在你的测试中使用你的 Ninject,你可以这样做,但我认为对于这个简单的案例来说这将是矫枉过正。

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

如果你想要一些真正神奇的注入,你也可以使用 Ninject 的MockingKernel扩展,但这对于这种情况几乎肯定是矫枉过正的。

于 2013-09-13T18:36:14.123 回答