コントローラーをテストするか、Web API の実行中のインスタンスに対してテストすることができます (おそらく両方を行う必要があります)。
コントローラーをテストしても目的が達成されないため、Web API アプリケーションの自己ホスト型インメモリ インスタンスを作成してテストする必要があります。次に、テスト クラスで HttpClient を使用するか (OData 要求を手動で作成する必要があります)、テスト クラスで WCF Data Services Client を使用できます (これにより、LINQ を介してクエリを実行できます)。
WCF Data Services クライアントを使用した例を次に示します。
public class ODataContainerFactory
{
static HttpSelfHostServer server;
public static MyApplicationServer.Acceptance.ODataService.Container Create(Uri baseAddress)
{
var config = new HttpSelfHostConfiguration(baseAddress);
// Remove self host requirement to run with Adminprivileges
config.HostNameComparisonMode = System.ServiceModel.HostNameComparisonMode.Exact;
// Register Web API and OData Configuration
WebApiConfig.Register(config);
// Configure IoC
ConfigureIoC(dataSource, config);
// Do whatever else, e.g. setup fake data sources etc.
...
// Start server
server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
// Create container
var container = new MyApplicationServer.Acceptance.ODataService.Container(new Uri(baseAddress.ToString() + "odata/"));
// Configure container
container.IgnoreResourceNotFoundException = true;
container.IgnoreMissingProperties = true;
return container;
}
private static void ConfigureIoC(MockDatasource dataSource, HttpSelfHostConfiguration config)
{
var container = new UnityContainer();
container.RegisterType<TypeA, TypeB>();
...
...
config.DependencyResolver = new IoCContainer(container);
}
public static void Destroy()
{
server.CloseAsync().Wait();
server.Dispose();
}
}
ここで重要なのは、Web API プロジェクトを呼び出す WebApiConfig.Register(HttpConfiguration config) メソッド呼び出しです。
上記の前に、次のものが必要になることに注意してください。
- Web API プロジェクトを開始する
- テスト クラスで、サービス参照を OData ルート パスに追加します。
これにより、Container オブジェクト (上記の例では MyApplicationServer.Acceptance.ODataService.Container) が作成されます。これを使用して、次のようにテストで OData フィードをクエリできます。
var odataContainer = ODataContainerFactory.Create(new Uri("http://localhost:19194/");
var result = odataContainer.MyEntities
.Expand(s => s.ChildReferenceType)
.Where(s => s.EntityKey == someValue).SingleOrDefault();