1

我正在尝试从基于 WebAPI 的 REST 服务转移到包含 OData 的新实现的服务。我的服务工作正常,但不知道如何创建单元测试来测试 odata 查询选项。

在对 WebAPI 方法进行单元测试时,我习惯于构建 httpRequestMessage 并将其注入到结构中:

var request = new HttpRequestMessage();
        request.Headers.Add("UserName", "TestUser");
        request.Headers.Add("Password", password);
        request.Headers.Add("OverRideToken", "false");
        request.Headers.Add("AccessSystem", "Mobile");
        request.Headers.Add("Seed", "testSeed");

        var token = new Token();

        var authController = new AuthorizationController(request);
        try
        {

            var returnValue = authController.Get();

我将如何注入 odata 请求?我需要验证 $filter、$inlinecount 和其他选项是否返回了正确的记录。

4

1 回答 1

0

您可以测试您的控制器,也可以针对您的 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 项目。

请注意,在上述之前,您将需要:

  1. 启动您的 Web API 项目
  2. 在您的测试类中,将服务引用添加到您的 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();
于 2013-09-14T04:48:44.950 回答