2017-12-07 6 views
0

Ich habe Klasse, die Instanz von HttpClient erstellt und einige Methoden aufrufen und Antwort im asynchronen Modus zurückgibt.Unit Test mit MS-Fake: HttpClient und warten

Für ReadAsAsync habe ich nuget Paket "System.Net.Http.Formatting" verwendet.

Source Code:

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; 
     }  
    } 

Einheit Test:

[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(); 
     } 
    } 

Wir können nicht den Quellcode ändern. aber GetAnsync- und ReadAsAync-Aufrufe müssen über Dummy-Aufruftest in Unit-Test durchgeführt werden.

+0

Warum laufen? Das sind keine * Ihre * Klassen, sie sind in .NET integriert. Es ist, als würde man fragen, wie man "int" oder "string" in Einheiten testet. Fragen Sie vielleicht, wie man sie * vortäuscht *, damit Sie 'MyClass' und' GetYourClass' testen können? –

+0

wie Sie diese Methoden testen – user2323308

+0

Nicht. Das musst du nicht. Sie wissen bereits, was sie tun werden, wenn die URL falsch ist oder wenn der Server eine Antwort zurückgibt. Es ist * Ihr Code *, der testet, nicht .NET. Wenn Sie HttpClient vortäuschen möchten, übergeben Sie Ihren eigenen HttpMessageHandler an den Konstruktor –

Antwort

0

Declare, die Ihr Test async und wartet auf die Antwort von der Quellklasse

[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 
    } 
}