2016-04-21 4 views
1

Я пытаюсь выполнить единичную тестовую логику связи REST для клиента UWP. Что касается the answer for System.Web.HttpClient, я обнаружил, что Windows.Net.HttpClient также принимает аргумент под названием IHttpFilter.UWP Windows.Web.HttpClient поддельный для модульного теста

Итак, я стараюсь сделать настраиваемый ответ с IHttpFilter, но я не знаю, как правильно ответить.

public class TestFilter : IHttpFilter 
    { 
     public IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request) 
     { 
      if (request.Method == HttpMethod.Get) 
      { 
       // response fake response for GET... 
      } 
     } 

     public void Dispose() 
     { 
      // do nothing 
     } 
    }   

И целевой метод для модульного теста приведен ниже.

public async Task<string> PostResult(HttpClient httpClient, string username) 
    { 
     var json = new JsonObject 
     { 
      {"Username", 
       JsonValue.CreateStringValue(string.IsNullOrEmpty(username) ? CommonKey.UnAuthorizedUserPartitionKey : username) 
      }, 
     }; 

     var content = new HttpStringContent(json.Stringify()); 
     content.Headers.ContentType = new HttpMediaTypeHeaderValue("application/json"); 

     // I want to make below line testable... 
     var response = await httpClient.PostAsync(new Uri(Common.ProcessUrl), content); 
     try 
     { 
      response.EnsureSuccessStatusCode(); 
      return null; 
     } 
     catch (Exception exception) 
     { 
      return exception.Message ?? "EMPTY ERROR MESSAGE"; 
     } 
    } 

Обратите внимание, что это не дублировать вопросы, связанные с System.Web.HttpClient насмешливой/подделка. То, что я прошу, - Windows.Web.HttpClient. Я не смог реализовать с ним.

Отметьте, что Windows.Web.Http.IHttpClient является внутренний доступен и HttpClient запечатан. Настолько сложно сделать Mock или наследовать и переопределить его.

+1

Почему бы не покончить с целым прямым вызовом 'HttpClient' и выставить необходимую функциональность за абстракцией. Вы даете себе лишнюю работу (ИМХО). – Nkosi

+0

правый. Я немного запутался :(Я добавляю целевой метод для проверки. – Youngjae

+0

Возможный дубликат [Mocking HttpClient в модульных тестах] (http://stackoverflow.com/questions/36425008/mocking-httpclient-in-unit-tests) – Nkosi

ответ

0

В то время как я согласен с некоторыми, что есть лучшие способы тестирования вызовов HttpClient, я отвечу на ваш вопрос о том, как создать «поддельный» ответ с реализацией IHttpFilter (System.Runtime.InteropServices.WindowsRuntime - ваш друг)

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices.WindowsRuntime; 
using System.Threading; 
using System.Threading.Tasks; 
using Windows.Foundation; 
using Windows.Web.Http; 
using Windows.Web.Http.Filters; 

namespace Project.UnitTesting 
{ 
    public class FakeResponseFilter : IHttpFilter 
    { 
     private readonly Dictionary<Uri, HttpResponseMessage> _fakeResponses = new Dictionary<Uri, HttpResponseMessage>(); 

     public void AddFakeResponse(Uri uri, HttpResponseMessage responseMessage) 
     { 
      _fakeResponses.Add(uri, responseMessage); 
     } 

     public void Dispose() 
     { 
      // Nothing to dispose 
     } 

     public IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request) 
     { 
      if (_fakeResponses.ContainsKey(request.RequestUri)) 
      { 
       var fakeResponse = _fakeResponses[request.RequestUri]; 
       return DownloadStringAsync(fakeResponse); 
      } 

      // Alternatively, you might want to throw here if a request comes 
      // in that is not in the _fakeResponses dictionary. 
      return DownloadStringAsync(new HttpResponseMessage(HttpStatusCode.NotFound) { RequestMessage = request }); 
     } 

     private IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> DownloadStringAsync(HttpResponseMessage message) 
     { 
      return AsyncInfo.Run(delegate (CancellationToken cancellationToken, IProgress<HttpProgress> progress) 
      { 
       progress.Report(new HttpProgress()); 

       try 
       { 
        return Task.FromResult(message); 
       } 
       finally 
       { 
        progress.Report(new HttpProgress()); 
       } 

      }); 
     } 
    } 
} 
Смежные вопросы