2015-10-22 10 views
8

私は私のBaseApiControllerクラスに次のメソッドを持っています。SingleResultと単体テスト

public virtual HttpResponseMessage GetById(int id) 
{ 
    var entity = repository.GetById(id); 

    if (entity == null) 
    {     
    var message = string.Format("No {0} with ID = {1}", GenericTypeName, id); 
    return ErrorMsg(HttpStatusCode.NotFound, message); 
    } 

    return Request.CreateResponse(HttpStatusCode.OK, SingleResult.Create(repository.Table.Where(t => t.ID == id))); 
} 

私はODataの要求のためのSingleResultを使用しています(私はSingleResultを作成しない場合は、単一のエンティティのための$expandの作品ではないので)。
しかし、私は具体的なコントローラ(AddressApiControllerなど)でこのメソッドのUnitTestsに問題があります。私はいつも結果にNULLを得る:

[TestMethod] 
public void Get_By_Id() 
{ 
    //Arrange 
    var moq = CreateMockRepository(); 
    var controller = new AddressApiController(moq); 
    controller.Request = new HttpRequestMessage() 
    controller.Request.SetConfiguration(new HttpConfiguration()) 
    // Action 
    HttpResponseMessage response = controller.GetById(1); 
    var result = response.Content.ReadAsAsync<T>().Result; 

    // Accert 
    Assert.IsNotNull(result); 
} 

私がチェックし、デバッグGetById()repository.Table.Where(t => t.ID == id))が適切な値を返すことを見つけるが、SingleResult.Create後、私はNULLを取得しています。

どうすればこの問題を解決できますか? SingleResultからコンテンツを読み込む方法や他の方法を使用する方法はありますか?

+0

を使用すると、ベースコントローラをテストしていますか?あなたのコードの完全な例をもっと表示してください。 – Andrei

+0

いいえ、私は具体的なコントローラをテストしています。私は質問を更新しました。 – Marusyk

+0

'SingleResult.Create'を追加する前にすべてがうまくいきます。 – Marusyk

答えて

0

私は拡張子を作成しました:その後、

public static class HttpResponseMessageExtensions 
    { 
     public static IQueryable<T> ContentToQueryable<T>(this HttpResponseMessage response) where T : BaseEntity 
     { 
      var objContent = response.Content as ObjectContent; 
      return objContent?.Value as IQueryable<T>; 
     } 

     public static T ContentToEntity<T>(this HttpResponseMessage response) where T : BaseEntity 
     { 
      var objContent = response.Content as ObjectContent; 
      return objContent?.Value as T; 
     } 
    } 

をして:

var result = response.ContentToEntity<T>(); 
0

は、私は、APIをモックアップする機会を持っていなかったが、ここでのドキュメントから:あなたはおそらく、その後、http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions

てみ変更idkeyと属性へ:ここ

は、メソッドのシグネチャのためのいくつかのルールです SingleResultを使用する必要はありません。

  • パスにキーが含まれている場合、アクションにはkeyという名前のパラメータが必要です。
  • パスにナビゲーションプロパティのキーが含まれている場合、アクションにはrelatedKeyという名前のパラメータが必要です。
  • [FromODataUri]パラメータを使用して、キーとrelatedKeyパラメータをデコレートします。
  • POSTおよびPUT要求は、エンティティタイプのパラメータを受け取ります。
  • PATCH要求はDelta型のパラメータをとります。ここで、Tはエンティティタイプです。

私はテストの結果が変わるかどうかを調べることに興味があります。

+0

ODataControllerと/ odata/Products(1)/ Suppliers(1)のようなルーティングは使用しません。私はこの記事を見ました – Marusyk