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);
}
}
HttpServer
とHttpConfiguration
に渡されたHttpClient
で動作しない理由は誰でも知っていますか?これを使用する多くの例を見てきました。
私ができた次の記事を参照して...
インメモリホスティングを使用したASP.NET Web API統合テスト
HttpServer
とHttpConfiguration
に渡される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