您可以测试您的控制器,也可以针对您的 Web API 的运行实例进行测试(您可能应该同时做这两个)。
测试您的控制器不会实现您想要做的事情,因此您需要通过创建 Web API 应用程序的自托管内存实例来进行测试。然后,您可以在测试类中使用 HttpClient(您必须手动构造 OData 请求),也可以在测试类中使用 WCF 数据服务客户端(这将允许您通过 LINQ 进行查询)。
这是使用 WCF 数据服务客户端的示例:
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();
}
}
这里的关键是 WebApiConfig.Register(HttpConfiguration config) 方法调用,它正在调用您的 Web API 项目。
请注意,在上述之前,您将需要:
- 启动您的 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();