2017-06-06 161 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

我最终没有嘲笑响应内容,只是设置了响应 –