5 Stimmen

MOQ zum Testen des Controllers verwenden

Ich habe Probleme beim Schreiben eines Unit-Tests für eine meiner Controller-Aktionen. Hier sind die Details.

Diese Ansicht ist stark typisiert:

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

Hier ist die Methode in dem zu testenden Controller:

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

Hier ist der Auszug aus dem Test (nUnit, MOQ), der mir Probleme bereitet:

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

Die ersten drei Setup-Anweisungen werden wegen eines zweideutigen Aufrufs nicht kompiliert:

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

Das vierte Programm wird kompiliert, löst aber diesen Fehler aus, wenn es die Return-Anweisung in der Controller-Aktion erreicht:

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

Ich glaube nicht, dass es relevant ist, aber es gibt zwei Überladungen der Methode, GetAll() und GetAll(int UserId). Ich bin sicher, es hat etwas mit dem OrderBy auf der Liste zu tun, aber ich bin ziemlich wackelig auf die Func Konzepte. Vielen Dank für Ihre Hilfe!

8voto

matma Punkte 1104

Sie können auch Folgendes verwenden NBuilder zusammen mit moq.

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

6voto

eu-ge-ne Punkte 27673

Versuchen Sie dies:

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

oder

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X