2017-06-06 151 views
1

我正在圈圈。所以當我在調試中運行時,我的WebApi將所需的輸出返回給瀏覽器。 Firefox和IE顯示我需要的列表。然而,當我試圖單元測試使用模擬和Autofac的響應HttpResponseMessage我回來沒有內容。我感覺它是在不同的上下文或類似的東西上返回的。我不完全確定,因此提出這個問題。我通過谷歌搜索和Autofac文檔一起把下面的單元測試一起串起來。使用Autofac和Moq單元測試HttpResponseMessage

WebApiMethod(包含在InScrapController_WebScrapSprocService由Autofac在構造函數注入)

public HttpResponseMessage GetFormItemsByFormNumber(int FormNumber) 
{ 
    HttpResponseMessage response; 
    try 
    { 
     //response = Request.CreateResponse(HttpStatusCode.OK, _WebScrapSprocService.GetFormItemsByFormNumber(FormNumber),new MediaTypeHeaderValue("application/json")); 
     response = Request.CreateResponse(HttpStatusCode.OK, new MediaTypeHeaderValue("application/json")); 
     response.Content = new StringContent(JsonConvert.SerializeObject(_WebScrapSprocService.GetFormItemsByFormNumber(FormNumber)),Encoding.UTF8, "application/json"); 
    } catch (Exception e) 
    { 
     response = Request.CreateResponse(HttpStatusCode.InternalServerError, new StringContent(e.Message), new MediaTypeHeaderValue("application/json")); 
    } 
    //Checking if bob knows anything about this... 
    string bob = response.Content.ReadAsStringAsync().Result; 
    return response; 
} 

單元測試

public void GetFormItemsByFormNumber() 
{ 
    using (var mock = AutoMock.GetLoose()) 
    { 

     var Service = mock.Mock<IWebScrapSprocService>().Setup(x => x.GetFormItemsByFormNumber(3392)); 
     var service = mock.Create<InScrapController>(); 
     service.Request = new HttpRequestMessage(); 
     service.Request.SetConfiguration(new HttpConfiguration()); 
     var HttpResponse = service.Request.CreateResponse(HttpStatusCode.OK, Service, new MediaTypeHeaderValue("application/json")); 
     var response = service.GetFormItemsByFormNumber(3392); 
     mock.Mock<IWebScrapSprocService>().Verify(x => x.GetFormItemsByFormNumber(3392)); 
     Assert.AreEqual(HttpResponse, response); 
    } 
} 

回答

1

這些反應都不會是相同的。此外,該測試方法應該重構。你也沒有收回任何內容,因爲你還沒有設置服務返回任何內容。

public IHttpActionResult GetFormItemsByFormNumber(int FormNumber) { 
    IHttpActionResult response; 
    try { 
     var result = _WebScrapSprocService.GetFormItemsByFormNumber(FormNumber); 
     response = Ok(result); 
    } catch (Exception e) { 
     response = InternalServerError(e); 
    } 
    return response; 
} 

接着更新測試

public void GetFormItemsByFormNumber() { 
    using (var mock = AutoMock.GetLoose()) { 
     // Arrange. 
     var formNumber = 3392; 
     var items = new List<FormItemsByFormNumber> { 
      new FormItemsByFormNumber { 
       //Populate as needed 
      }, 
      new FormItemsByFormNumber { 
       //Populate as needed 
      }, 
      //...etc 
     }; 
     var serviceMock = mock.Mock<IWebScrapSprocService>(); 
     serviceMock.Setup(x => x.GetFormItemsByFormNumber(formNumber)) // Calling this... 
      .Returns(items) // should return some value... 
      .Verifiable(); // and I want to verify that it was called. 
     var sut = mock.Create<InScrapController>(); 

     // Act. 
     var response = sut.GetFormItemsByFormNumber(formNumber) as OkNegotiatedContentResult<List<FormItemsByFormNumber>>(); 

     // Assert. 
     serviceMock.Verify(); //verify setups were exercised as expected. 
     Assert.IsNotNull(response); 
    } 
} 
+0

任何理由簡單地移除'串BOB = response.Content.ReadAsStringAsync()結果;'我有問題莖形式ReadAsStringAsync根本就不是被mockable –

+0

我最終沒有嘲笑響應內容,只是設置了響應 –