我正在尝试从基于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和其他选项是否返回了正确的记录。

===============>>#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 feed,如下所示:

var odataContainer = ODataContainerFactory.Create(new Uri("http://localhost:19194/");

var result = odataContainer.MyEntities
                .Expand(s => s.ChildReferenceType)
                .Where(s => s.EntityKey == someValue).SingleOrDefault();

  ask by Gareth Suarez translate from so

未解决问题?本站智能推荐:

关注微信公众号