【问题标题】:Using MOQ to test controller使用 MOQ 测试控制器
【发布时间】:2009-06-14 20:57:50
【问题描述】:

我在为我的控制器操作之一编写单元测试时遇到问题。这是详细信息。

这个视图是强类型的:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Request>>"

下面是被测控制器中的方法:

    // GET: /Request/List
    public ActionResult List()
    {
        return View("List", 
            requestRepository.GetAll(User.Id).OrderByDescending(x => x.Id));
    }

这是给我带来问题的测试(nUnit,MOQ)的摘录:

    //mockRequestRepository
    //    .Setup(repo => repo.GetAll(It.IsAny<int>()))
    //    .Returns(List<Request>());
    //mockRequestRepository
    //    .Setup(repo => repo.GetAll(It.IsAny<int>()))
    //    .Returns(IList<Request>());
    //mockRequestRepository
    //    .Setup(repo => repo.GetAll(It.IsAny<int>()))
    //    .Returns(IEnumerable<List<Request>>());
    mockRequestRepository
          .Setup(repo => repo.GetAll(It.IsAny<int>()))
          .Returns(It.IsAny<List<Request>>());

前三个 setup 语句由于调用不明确而无法编译:

Moq.Language.Flow.IReturnsResult<Core.Repositories.IRequestRepository>
Returns(System.Collections.Generic.IList<Core.Entities.Request> 
(in interface IReturns<IRequestRepository, IList<Request>>)

Moq.Language.Flow.IReturnsResult<Core.Repositories.IRequestRepository>
Returns(System.Func<System.Collections.Generic.IList<Core.Entities.Request>> 
(in interface IReturns<IRequestRepository, IList<Request>>)

第四个会编译但是当它到达控制器动作中的return语句时会抛出这个错误:

InnerException  {"Value cannot be null.\r\nParameter name: source"} 
System.Exception {System.ArgumentNullException}

我认为这无关紧要,但该方法有两个重载,GetAll() 和 GetAll(int UserId)。我确信它与 List 上的 OrderBy 有关系,但我对 Func 概念很不满意。感谢您的帮助!

【问题讨论】:

    标签: c# asp.net-mvc unit-testing moq


    【解决方案1】:

    您也可以将NBuilder 与起订量一起使用。

    _repository.Setup(rep => rep.GetAll(It.IsAny<int>()))  // <-- Moq magic
        .Returns( 
            Builder<Request>.CreateListOfSize(10).Build()  // <-- NBuilder magic
        );
    

    【讨论】:

      【解决方案2】:

      试试这个:

      mockRequestRepository.Setup(repo => repo.GetAll(It.IsAny<int>()))
          .Returns(new List<Request> { /* empty list */ });
      

      mockRequestRepository.Setup(repo => repo.GetAll(It.IsAny<int>()))
          .Returns(new List<Request> {
              new Request { Prop1 = ..., PropN = ... },
              new Request { Prop1 = ..., PropN = ... },
              ...
          });
      

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多