Использование 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.
Parameter name: source"} 
System.Exception {System.ArgumentNullException}

Я не думаю, что это актуально, но есть два перегрузки метода: GetAll () и GetAll (int UserId). Я уверен, что у него есть что-то, чтобы сделать OrderBy в Списке, но я довольно шаткий в концепциях Func. Спасибо за вашу помощь!

c#,asp.net-mvc,unit-testing,moq,

4

Ответов: 2


5 принят

Попробуй это:

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

8 ов

Вы также можете использовать NBuilder вместе с moq.

_repository.Setup(rep => rep.GetAll(It.IsAny<int>()))  // <-- Moq magic
    .Returns( 
        Builder<Request>.CreateListOfSize(10).Build()  // <-- NBuilder magic
    );
C #, asp.net-MVC, блок-тестирование, MOQ,
Похожие вопросы
Яндекс.Метрика