差分
編集の要約なし
[[ASP.NET Web APIのユニットテストをAPI]]の[[ユニットテスト]]を[[NUnit]]で行えると[[Xamarin Studio]]での開発が捗る。での[[開発]]が捗る。
==概要==
[[Xamarin.iOS]]や[[Xamarin.Android]]は[[ユーザーインターフェース]]と[[ビジネスロジック]]の分離が売り文句である。
==実装1==
NUnitプロジェクトはTestFixtureSetUp属性を付けたメソッドから呼び出す。
<source lang="csharp">
[TestFixtureSetUp]
public void Setup()
{
var config = new HttpConfiguration();
SampleWebApi.WebApiConfig.Register(config); // ←←←これ重要
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
</source>
===手順4===
NUnitライブラリプロジェクトにインメモリサーバー関連のコードを記述する。
<source lang="csharp">
using NUnit.Framework;
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Formatting;
using System.Web.Http;
namespace SampleWebApi.Tests
{
[TestFixture]
public class InMemoryTests
{
private const string UrlBase = "http://127.0.0.1:8080/";
private HttpServer _server;
[TestFixtureSetUp]
public void Setup()
{
var config = new HttpConfiguration();
// ASP.NETプロジェクトの何かしらのメソッドを呼び出す。
// 初期化コードを共通化しておくのが間違いないと思われる。
SampleWebApi.WebApiConfig.Register(config);
// エラーをいっぱいだす
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
// 重要
// ASP.NETプロジェクトの何かしらのメソッドを呼び出した後にインメモリサーバーのインスタンスを作ること
_server = new HttpServer(config);
}
public void Dispose()
{
if (_server != null)
{
_server.Dispose();
_server = null;
}
}
[Test]
public void Get()
{
using (var client = new HttpClient(_server))
{
var request = CreateRequest(
"api/Hello",
"application/json",
HttpMethod.Get);
using (var response = client.SendAsync(request).Result)
{
Assert.IsNotNull(response);
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
Assert.NotNull(response.Content);
}
}
}
[Test]
public async void Post()
{
using (var client = new HttpClient(_server))
{
var request = CreateRequest(
"api/Hello",
"application/json",
HttpMethod.Post,
"monobook" ,
new JsonMediaTypeFormatter());
using (var response = client.SendAsync(request).Result)
{
Assert.IsNotNull(response);
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
Assert.NotNull(response.Content);
}
}
}
private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
{
var request = new HttpRequestMessage();
request.RequestUri = new Uri(UrlBase + url);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
request.Method = method;
return request;
}
private HttpRequestMessage CreateRequest<T>(string url, string mthv, HttpMethod method, T content, MediaTypeFormatter formatter) where T : class
{
HttpRequestMessage request = CreateRequest(url, mthv, method);
request.Content = new ObjectContent<T>(content, formatter);
return request;
}
}
}
</source>
===おわり===
==関連項目==