2016-03-28 18 views
1

ウェブクライアントからajax経由で呼び出しているREST APIエンドポイントがいくつかあります。これらのエンドポイントがWebブラウザの外部で正しく動作することを確認するための自動テストをいくつか書きたいと思います。REST APIエンドポイントのテスト

私はユニットテストのテストとしてそれらを書いて、ここで私はこれまで持っているものですしています:

[TestClass] 
public class ApiTests 
{ 
    string local_host_address = "http://localhost:1234//"; 

    public async Task<string> Post(string path, IEnumerable<KeyValuePair<string, string>> parameters) 
    { 
     using (var client = new HttpClient()) 
     { 
      client.Timeout = new TimeSpan(0,0,5); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      var response_message = await client.PostAsync(local_host_address + path, new FormUrlEncodedContent(parameters)); 
      var response = await response_message.Content.ReadAsStringAsync(); 

      if (response_message.IsSuccessStatusCode) 
      { 
       return response; 
      } 
      else 
      { 
       throw new Exception("Request failed"); 
      } 
     } 
    } 

    [TestMethod] 
    [TestCategory("ApiTests")] 
    public void TestLogon() 
    { 
     var parameters = new Dictionary<string, string>(); 
     parameters["email"] = "[email protected]"; 
     parameters["password"] = "rosebud"; 

     Task.Run(() => 
     { 
      var output = Post("Default.aspx/Logon", parameters); 
      Console.WriteLine(output.Result); 
     }).Wait(); 
    } 
} 

...、それだけで特定のエンドポイントを呼び出し、結果を返すために、かなり基本的な試みます。問題は、この呼び出しはdefault.aspx/logonによって生成された結果ではなく、基本的なdefault.aspx Webページの本文を返します。私は何か間違っていますが、私はデバッガでそれを終えてしまいました。エラーが表示されません。 default.aspx/logonエンドポイントが存在し、Webサイトからアクセスすると完全に機能します。行方不明か何か見落としていますか?

-TTM

SOLUTION:私のコードスニペットの

ブルーノの変更は非常にうまく動作します。 RESTエンドポイントをテストする問題を解決しようとする人は、単体テストに入れてPOCOを渡すだけで、JSON応答を返すことができます。

答えて

2

要求をapplication/jsonとしてマークしたにもかかわらず、本文をFormUrlEncodedとして送信しています。

あなたのAPIはRESTで、代わりに辞書を取る、JSONを取る場合は、あなたがオブジェクト(例えばNewtonsoft.Json付き)をデシリアライズできます

public async Task<string> Post<T>(string path, T data) 
    { 
     using (var client = new HttpClient()) 
     { 
      client.Timeout = new TimeSpan(0, 0, 5); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      var json = JsonConvert.SerializeObject(data); 

      var response_message = await client.PostAsync(local_host_address + path, new StringContent(json, Encoding.UTF8, "application/json"); 

      var response = await response_message.Content.ReadAsStringAsync(); 

      if (response_message.IsSuccessStatusCode) 
      { 
       return response; 
      } 
      else 
      { 
       throw new Exception("Request failed"); 
      } 
     } 
    } 
+0

私は地元を介してアクセス可能なウェブAPIを作成しましたIIS。どうすればそれを外部から入手できますか?ありがとう。 – Si8

関連する問題