5

コントローラー アクションの 1 つの単体テストを書くのに問題があります。詳細はこちら。

このビューは強く型付けされています:

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

最初の 3 つの 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>>)

4 番目はコンパイルされますが、コントローラー アクションの return ステートメントに到達すると、このエラーがスローされます。

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

関係ないと思いますが、メソッドには GetAll() と GetAll(int UserId) の 2 つのオーバーロードがあります。List で OrderBy を実行する何かがあると確信していますが、Func の概念についてはかなり不安定です。ご協力いただきありがとうございます!

4

2 に答える 2

8

NBuilder をmoqと一緒に使用することもできます。

_repository.Setup(rep => rep.GetAll(It.IsAny<int>()))  // <-- Moq magic
    .Returns( 
        Builder<Request>.CreateListOfSize(10).Build()  // <-- NBuilder magic
    );
于 2009-06-17T13:49:44.970 に答える
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 = ... },
        ...
    });
于 2009-06-14T21:04:07.713 に答える