【问题标题】:Pointers need on first test with NUnit and MVC Contrib使用 NUnit 和 MVC Contrib 进行第一次测试时需要指针
【发布时间】:2010-12-04 11:03:20
【问题描述】:

我正在使用 ASP.NET MVC 2、NUnit、Moq 和 MVC Contrib。我已经编写了我的第一个单元测试,关于这个测试我有几个问题。我的情况是我有一个索引视图。在这个视图中,我有一个显示所有新闻项目的网格。

这是我的 INewsRepository 类:

public interface INewsRepository
{
   IEnumerable<News> FindAll();
}

我的测试类和测试方法:

public class NewsControllerTest :TestControllerBuilder
{
   private Mock<INewsRepository> mockNewsRepository;
   private NewsController newsController;

   [SetUp]
   public void Init()
   {
      mockNewsRepository = new Mock<INewsRepository>();
      newsController = new NewsController(mockNewsRepository.Object);
      InitializeController(newsController);
   }

   [Test]
   public void NewsController_Index()
   {
      // Arrange
      var news = new Mock<IEnumerable<News>>();
      mockNewsRepository.Setup(r => r.FindAll()).Returns(news.Object).Verifiable();

      // Act
      ActionResult actual = newsController.Index();

      // Assert
      mockNewsRepository.Verify();
      actual
         .AssertViewRendered()
         .ForView("Index")
         .WithViewData<News[]>()
         .ShouldBe(news);
   }
}

我的看法:

public ActionResult Index()
{
   FakeNewsRepository fakeNewsRepository = new FakeNewsRepository();
   IEnumerable<News> news = fakeNewsRepository.FindAll();
   return View(news);
}

我需要一些关于我做的方式的指示。我的方向正确吗?我应该添加什么,我应该省略什么?我想做单元测试,我是否将它与集成测试混合在一起?任何额外的建议将不胜感激。

当我在 NUnit GUI 控制台中运行此测试时,我得到了一个错误,我不确定这意味着什么:

MyProject.Web.Tests.Controllers.NewsControllerTest.NewsController_Index:
Moq.MockVerificationException : The following setups were not matched:
INewsRepository r => r.FindAll()

【问题讨论】:

    标签: asp.net-mvc nunit moq mvccontrib


    【解决方案1】:
    public ActionResult Index()
    {
        FakeNewsRepository fakeNewsRepository = new FakeNewsRepository();
        IEnumerable<News> news = fakeNewsRepository.FindAll();
        return View(news);
    }
    

    您不能在您的操作中模拟像这样硬编码的存储库。您在操作中实例化它,您将永远无法对此进行单元测试并模拟存储库。存储库需要作为依赖注入。您可以使用接口并将此接口传递给控制器​​的构造函数:

    public class HomeController: Controller
    {
        private readonly IRepository _repository;
        public class HomeController(IRepository repository)
        {
            _repository = repository;
        }
    
        public ActionResult Index()
        {
            IEnumerable<News> news = _repository.FindAll();
            return View(news);
        }
    }
    

    现在在您的单元测试中,您可以将存储库的模拟实例传递给控制器​​构造函数并定义期望值。

    还要注意MVCContrib.TestHelper 是为与Rhino Mocks 一起工作而设计的。我不太确定它是否适用于最小起订量。

    【讨论】:

    • 在您的代码中,您有一个名为 _sut 的控制器的变量名称。为什么这么称呼它?
    • 被测对象。这样就很清楚被测试的类型是什么。
    • 当我测试我的控制器时,您还有什么可以评论的吗?我在一次测试中做的太多,太少了吗?在测试控制器时,你能给我什么建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2010-11-12
    • 2011-02-20
    相关资源
    最近更新 更多