2017-03-10 19 views
1

と私はSessionId下記のようなウェブAPIコントローラメソッドはタイプ「文字列」<IHttpActionResult>匿名型

[HttpPost] 
[Route("init")] 
[ApiMeter("search_init")] 
public async Task<IHttpActionResult> InitiateAsync(SearchInitRequest query, 
    CancellationToken cancellationToken) 
{ 
    Validations.EnsureValid(query, new SearchRequestValidator()); 
    string sessionId = await Service.InitiateSearchAsync(query, cancellationToken); 
    return Ok(new { sessionId }); 
} 

である持っていると私は

以下のようなテストケースを持っています
[Fact] 
public void GetSearchInit_Success_Valid() 
{ 
    var mockCarService = new Mock<ICarService>(); 

    using (new AmbientContextScope(GetCarCallContext())) 
    { 
     var request = Data.DataProvider.TestDataProvider.GetJsonResult<CarSearchInitRequest>(
     SearchInitScenarioRequests.CarSearchInitSuccess); 
     var response = Data.DataProvider.TestDataProvider.GetResponse<CarSearchInitResponse>(
     SearchInitScenarioResponse.CarSearchInitSuccess); 

     mockCarService.Setup(f => f.InitiateSearchAsync(request, CancellationToken.None)) 
      .Returns(Task.FromResult(response.SessionId)); 

     SearchController controller = new SearchController(mockCarService.Object); 
     var result = controller.InitiateAsync(request, CancellationToken.None).Result; 
     var status = result as OkNegotiatedContentResult<string>; 
     Assert.NotNull(status.Content); 

    } 
} 

このテストケースでは、ステータスがnullとなっています。しかしデバッグ中にstatus.Contentの中にSessionIdのプロパティがあるのがわかりますが、これは匿名型なのでその値を読み取ることはできません。

私も

var status = result as OkNegotiatedContentResult<object>; 

で試してみましたが、まだここで運

答えて

0

は、アクションのテストを回避することができる方法の最小限の完全な例ではありません。しかしこれは、結果の内容にアクセスするためにフレームワーク機能を通過するため、統合テストのほうがはるかに重要です。

[TestClass] 
public class UnitTest6 { 
    [TestMethod] 
    public async Task Action_Returns_AnonymousTypeResult() { 
     //Arrange 
     var controller = new SearchController() { 
      Configuration = new HttpConfiguration(), 
      Request = new HttpRequestMessage() 
     }; 
     var expected = "hello world"; 

     //Act 
     var result = await controller.InitiateAsync(); 
     var response = await result.ExecuteAsync(CancellationToken.None); 
     var status = await response.Content.ReadAsAsync<dynamic>(); 

     //Assert 
     Assert.IsNotNull(status.sessionId); 
     Assert.AreEqual(expected, status.sessionId); 
    } 

    [Authorize] 
    public class SearchController : ApiController { 
     [HttpPost] 
     public async Task<IHttpActionResult> InitiateAsync() { 
      string sessionId = await Task.FromResult("hello world"); 
      return Ok(new { sessionId }); 
     } 
    } 
} 

結果を実行して応答メッセージを取得することで、応答の内容にアクセスできるようになりました。メンバーにアクセスできるようにコンテンツをdynamicとして解析できるようにします。