2016-06-09 9 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?

ответ

1

вы попробуете это: Visual Studio 2013 Update 4 Changes MSFakes Shim Object Default Behaviour в основном, называют Microsoft.QualityTools.Testing.Fakes.Shims.ShimBehaviors.BehaveAsDefaultValue(); до создания экземпляра прокладки

+0

Отлично! Это исправило это. Я думал, что это будет однострочное исправление. Благодаря! – John