使用MOQ测试控制器

时间:2009-06-14 20:57:50

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

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

此视图是强类型的:

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>>());

由于调用模糊,前三个安装语句将无法编译:

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)。我确定列表中的OrderBy有一些功能,但我对Func概念感到非常不稳定。谢谢你的帮助!

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

试试这个:

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 = ... },
        ...
    });