web-dev-qa-db-ja.com

Visual Studio 2013でのHttpClientを使用した単体テスト/統合テストWeb API

Visual Studio 2013でAPIコントローラーをテストしようとしていますが、苦労しています。私の1つのソリューションには、Web APIプロジェクトとテストプロジェクトがあります。私のテストプロジェクトでは、これを使用した単体テストがあります。

[TestMethod]
public void GetProduct()
{
    HttpConfiguration config = new HttpConfiguration();
    HttpServer _server = new HttpServer(config);

    var client = new HttpClient(_server);

    var request = new HttpRequestMessage
    {
        RequestUri = new Uri("http://localhost:50892/api/product/hello"),
        Method = HttpMethod.Get
    };

    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    using (var response = client.SendAsync(request).Result)
    {
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

        var test = response.Content.ReadAsAsync<CollectionListDTO>().Result;
    }
}

404を取得し続ける。 Visual Studio(IIS Express)の1つのインスタンスでAPIを実行し、別のインスタンスでこのユニットテストをデバッグしようとしました。しかし、運はありません。このURLをブラウザーに配置できることを確認し(1つのVisual Studioがデバッグしている場合)、JSON応答が表示されます。しかし、ユニットテストとHttpClientで動作させる方法がわかりません。オンラインで例を見つけようとしましたが、見つけられないようです。誰か助けてもらえますか?

更新1:ルートに追加しようとしましたが、何も起こりませんでした。

HttpConfiguration config = new HttpConfiguration();

// Added this line
config.Routes.MapHttpRoute(name: "Default", routeTemplate: "api/product/hello/");

HttpServer _server = new HttpServer(config);

var client = new HttpClient(_server);

[...rest of code is the same]

これが私のAPIコントローラーです

[HttpGet]
[Route("api/product/hello/")]
public IHttpActionResult Hello()
{
     return Ok();
}

PDATE Resolution:HttpClientオブジェクトなしでHttpServerを更新すると、動作するようになりました。それでも、VSの2つのインスタンスを実行する必要があります。 1つはAPIコードを実行し、もう1つはユニットテストを実行します。

作業方法は次のとおりです。

[TestMethod]
public void Works()
{
    var client = new HttpClient(); // no HttpServer

    var request = new HttpRequestMessage
    {
        RequestUri = new Uri("http://localhost:50892/api/product/hello"),
        Method = HttpMethod.Get
    };

    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    using (var response = client.SendAsync(request).Result)
    {
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
    }
}

HttpServerHttpConfigurationに渡されたHttpClientで動作しない理由は誰でも知っていますか?これを使用する多くの例を見てきました。

14
duyn9uyen

私ができた次の記事を参照して...

インメモリホスティングを使用したASP.NET Web API統合テスト

HttpServerHttpConfigurationに渡されるHttpClientを操作することにより。次の例では、属性ルーティングを使用する簡単なApiControllerを作成しました。属性ルートをマップするようにHttpConfigurationを構成し、それを新しいHttpServerに渡しました。 HttpClientは、構成されたサーバーを使用して、テストサーバーへの統合テスト呼び出しを行うことができます。

public partial class MiscUnitTests {
    [TestClass]
    public class HttpClientIntegrationTests : MiscUnitTests {

        [TestMethod]
        public async Task HttpClient_Should_Get_OKStatus_From_Products_Using_InMemory_Hosting() {

            var config = new HttpConfiguration();
            //configure web api
            config.MapHttpAttributeRoutes();

            using (var server = new HttpServer(config)) {

                var client = new HttpClient(server);

                string url = "http://localhost/api/product/hello/";

                var request = new HttpRequestMessage {
                    RequestUri = new Uri(url),
                    Method = HttpMethod.Get
                };

                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                using (var response = await client.SendAsync(request)) {
                    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
                }
            }
        }
    }

    public class ProductController : ApiController {
        [HttpGet]
        [Route("api/product/hello/")]
        public IHttpActionResult Hello() {
            return Ok();
        }
    }
}

コントローラを統合テストするために、VSの別のインスタンスを実行する必要はありませんでした。

次のテストの簡易バージョンも同様に機能しました

var config = new HttpConfiguration();
//configure web api
config.MapHttpAttributeRoutes();

using (var server = new HttpServer(config)) {

    var client = new HttpClient(server);

    string url = "http://localhost/api/product/hello/";

    using (var response = await client.GetAsync(url)) {
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
    }
}

あなたの場合、あなたはあなたのWeb API設定に一致するようにサーバーを適切に設定していることを確認する必要があります。これは、APIルートをHttpConfigurationオブジェクトに登録する必要があることを意味します。

var config = new HttpConfiguration();
//configure web api
WebApiConfig.Register(config);
//...other code removed for brevity
24
Nkosi