2017-04-06 6 views
1

私は.netコアで単体テストに慣れようとしています。残念ながら、私はHttpClientラッパーが失敗したHttpResponseMessageを返すようになっています。xunitでnullを返すHockpientラッパーを嘲笑しました

[Fact] 
public async void TestHttpExceptionOnBadRequest() 
{ 
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes("Test"))) 
    { 
     var xmlSerializer = new Mock<IXmlSerializer>(); 
     xmlSerializer.Setup(serializer => serializer.Deserialize(stream)).Returns(new object()); 

     var httpClient = new Mock<IHttpHandler>(); 
     httpClient.Setup(client => client.GetAsync("Test")) 
      .Returns(Task.FromResult(new HttpResponseMessage(HttpStatusCode.BadRequest))); 

     var postcodeLookup = new PostcodeLookupService(xmlSerializer.Object, httpClient.Object, "", ""); 
     await Assert.ThrowsAsync<HttpRequestException>(async() => await postcodeLookup.SearchAsync("", "")); 
    } 
} 

を自分のサービスコードを以下に示します。ここでは

は私が作業を取得しようとしている私のテストです。問題はresponse.EnsureSuccessStatusCode();がnullを返すことです。ここ

public async Task<PostcodeContainer> SearchAsync(string text, string container) 
{ 
    // add the query parameters to the query string 
    var query = _baseQueryString + "&text=" + WebUtility.UrlEncode(text); 
    query += "&container=" + WebUtility.UrlEncode(container); 

    // initiate client & response 
    var response = await _httpClient.GetAsync(query); 
    response.EnsureSuccessStatusCode(); 

    return (PostcodeContainer)_serializer.Deserialize(await response.Content.ReadAsStreamAsync()); 
} 

万全を期すためには、モックの目的のために私のIHttpHandler定義です。

public interface IHttpHandler 
{ 
    HttpResponseMessage Get(string url); 
    HttpResponseMessage Post(string url, HttpContent content); 
    Task<HttpResponseMessage> GetAsync(string url); 
    Task<HttpResponseMessage> PostAsync(string url, HttpContent content); 
} 

答えて

2

これは、予想されるクエリの設定がテスト対象のメソッドで生成されたものと一致しないためです。

// add the query parameters to the query string 
var query = _baseQueryString + "&text=" + WebUtility.UrlEncode(text); 
query += "&container=" + WebUtility.UrlEncode(container); 

これは、それが​​と一致しない、予期しないクエリを取得するときに何をすべきかわからないので、モックがnullを返すようになります。

だから_baseQueryStringはまた、例中の試験に基づいて、空の文字列生成されたクエリが

&text=&container= 

として終わることができるため、そのモックが期待どおりに実行するために受け取ることを期待すべきかであると仮定。また、シリアライザが何かを行う前に、テスト中のメソッドがエラーになることが予想されるので、何もする必要はありません。ちょうどそれを嘲笑し、偽物を渡す。

クライアントは、セットアップ式でIt.IsAny<string>()を使用して任意のクエリを期待することもできます。機能acync実行する場合

最後には、テスト・リターンTaskを持って

[Fact] 
public async Task TestHttpExceptionOnBadRequest() { 

    var xmlSerializer = new Mock<IXmlSerializer>(); 
    xmlSerializer 
     .Setup(serializer => serializer.Deserialize(It.IsAny<Stream>())) 
     .Returns(new PostcodeContainer()); 

    var expectedResponse = new HttpResponseMessage(HttpStatusCode.BadRequest); 
    var httpClient = new Mock<IHttpHandler>(); 
    httpClient 
     .Setup(client => client.GetAsync(It.IsAny<string>())) 
     .ReturnsAsync(expectedResponse); 

    var postcodeLookup = new PostcodeLookupService(xmlSerializer.Object, httpClient.Object, "", ""); 
    await Assert.ThrowsAsync<HttpRequestException>(async() => await postcodeLookup.SearchAsync("", "")); 
} 
関連する問題