2017-12-07 16 views
0

HttpClientのインスタンスを作成してメソッドを呼び出し、非同期モードで応答を返すクラスがあります。MSフェイクを使った単体テスト:HttpClientと待ち受け

ReadAsAsyncでは、 "System.Net.Http.Formatting"というパッケージを使用しています。

ソースコード:

public class MyClass 
    { 
     readonly HttpClient client = new HttpClient();  
     public MyClass() 
     { 
      string myUrl = ConfigurationManager.AppSettings["MyWebAPI"]; 
      client.BaseAddress = new Uri(myUrl); 
     } 
     public async Task<List<YourClass>> GetYourClass() 
     { 
      var filters = "string"; 
      HttpResponseMessage response = await client.GetAsync(filters).ConfigureAwait(false); 

      if (response.IsSuccessStatusCode) 
      { 
       var notes = await response.Content.ReadAsAsync<List<YourClass>>(); 
       return notes; 
      } 
      return null; 
     } 
    } 
    public class YourClass 
    { 
     private string Address { get; set; } 

     public YourClass(string address) 
     { 
      Address = address; 
     }  
    } 

単体テスト:

[TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void TestMethod1() 
     { 
      using (ShimsContext.Create()) 
      { 
       MyClass obj = new MyClass(); 
       ShimHttpClient shimHttpClient = new ShimHttpClient(); 
       ShimHttpClient.Constructor = (t) => 
       { 
        shimHttpClient = new ShimHttpClient(); 
        shimHttpClient.GetAsyncString = (a) => 
        { 
         return new System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>(function1); 
        }; 
       }; 
       var returnVal = obj.GetYourClass(); 
      } 
     } 

     private System.Net.Http.HttpResponseMessage function1() 
     { 
      return new System.Net.Http.HttpResponseMessage(); 
     } 
    } 

私たちは、ソースコードを変更することはできません。ダミーコールテストを介してユニットテストGetAsyncとReadAsAyncコールを行う必要があります。あなたのテストは、非同期実行とする

+0

なぜからの応答を待ちますか?それらはあなたのクラスではなく、.NETに組み込まれています。これは 'int'や' string'の単体テスト方法を尋ねるようなものです。あなたはおそらくそれらを模倣する方法を尋ねているので、あなたは 'MyClass'と' GetYourClass'をテストできますか? –

+0

これらのメソッドをテストする方法 – user2323308

+0

しないでください。あなたはする必要はありません。 URLが間違っている場合、またはサーバーから応答が返ってきた場合、ユーザーが何をするかはすでに分かっています。 .NETのものではなく、テストが必要な*あなたのコード*です。 HttpClientをモックしたい場合は、独自のHttpMessageHandlerをコンストラクタ –

答えて

0

宣言は、ソースクラス

[TestMethod] 
public async Task TestMethod1() 
{ 
    using (ShimsContext.Create()) 
    { 
     MyClass obj = new MyClass(); 
     ShimHttpClient shimHttpClient = new ShimHttpClient(); 
     ShimHttpClient.Constructor = (t) => 
     { 
      shimHttpClient = new ShimHttpClient(); 
      await shimHttpClient.GetAsyncString = (a) => 
      { 
       return new System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>(function1); 
      }; 
     }; 
     var returnVal = await obj.GetYourClass(); 
     Assert.IsNotNull(returnVal); 
     //make more assertations on the returnVal 
    } 
} 
関連する問題