2016-06-09 34 views
0

我使用的垫片(由Visual Studio生成),以伪造一个HttpClient的实例。下面是SUT:ShimNotImplementedException:System.Net.Http.HttpMessageInvoker.Dispose()

public class ExampleForSO 
{ 

    private HttpClient _httpClient; 

    public ExampleForSO(HttpClient httpClient) 
    { 
     _httpClient = httpClient; 
    } 

    public async Task<List<string>> GetListAsync() 
    { 
     using (_httpClient) 
     { 
      return await GetListFromHostAsync(_httpClient); 
     } 
    } 

    public async Task<List<string>> GetListFromHostAsync(HttpClient httpClient) 
    { 

     var responseJson = await 
      httpClient.GetAsync("abc") 
      .Result.Content.ReadAsStringAsync() 
      ; 

     var fList = JsonConvert.DeserializeObject<List<string>>(responseJson); 

     return fList; 
    } 

这里是单元测试:

[TestMethod] 
public void TestMethod1() 
{ 
    // Create a fake HttpClient 
    using (ShimsContext.Create()) 
    { 
     var fake = new ShimHttpClient() 
     { 

      GetAsyncString = (uri) => 
      { 
       var hrm = new HttpResponseMessage(HttpStatusCode.OK); 
       var list = new List<string>() {"file1", "file2"}; 
       hrm.Content = new StringContent(JsonConvert.SerializeObject(list)); 
       var t = new Task<HttpResponseMessage>(() => hrm); 
       return Task.Run(() => hrm); 
      } 

     }; 

     var _exampleForSO = new ExampleForSO(fake); 

     var returnValue = _exampleForSO.GetListAsync(); 

     // This line will throw an exception: 
     var value = returnValue.Result; 

     Assert.IsNotNull(returnValue); 

    } 
} 

当我运行这个垫片抛出一个异常ShimNotImplemented。堆栈跟踪显示这一点:

$Action1NotImplemented71f6f23c-d227-4cb6-ac76-1f8c8094c413.Invoke(HttpMessageInvoker arg1) at System.Net.Http.HttpMessageInvoker.Dispose()

如果我注释掉using (_httpClient),单元测试将在不抛出异常运行,但不是生产一个很好的解决方案。我的问题,我如何分配一个函数System.Net.Http.HttpMessageInvoker.Dispose()填充代表?我无法在任何地方找到它的参考。我是否必须为HttpMessageInvoker创建一个假,并指定给另一个shim属性?

回答