【问题标题】:Mocking or creating pragmatically ODataQueryOptions for .NET 5 Core Controller unit test为 .NET 5 Core Controller 单元测试模拟或实际创建 ODataQueryOptions
【发布时间】:2021-06-07 18:26:29
【问题描述】:

我正在将我们现有的 API 迁移到 .net 5,我面临着单元测试迁移的问题。 我想保留测试和测试控制器,但我找不到处理 ODataQueryOptions 的方法,因为此类已更改,我再也找不到创建 ODataQueryOptions 的方法。 所有与我的问题相关的主题都已过时。

这是在迁移之前如何测试控制器的旧代码

_userController.Request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://localhost/api?$orderby=UserName desc"));
            _queryOptionsUser = new ODataQueryOptions<User>(_queryOptionsUser.Context, _userController.Request);
            PageResult<UserDto> users = _userController.GetUsers(Constants.ValidOrgCode1, _queryOptionsUser);

如果有人能提供狙击手如何处理类似问题并能够测试控制器,我将不胜感激。

【问题讨论】:

    标签: c# .net asp.net-core-webapi .net-5


    【解决方案1】:

    最后,我结束了。

    有控制器的方法进行单元测试

    public PageResult<User> GetAll(ODataQueryOptions<User> odataQuery) 
    

    单元测试

    // Arrange
    var modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.EntitySet<User>("User");
    var edmModel = modelBuilder.GetEdmModel();
    
    const string routeName = "odata";
    IEdmEntitySet entitySet = edmModel.EntityContainer.FindEntitySet("User");
    ODataPath path = new ODataPath(new EntitySetSegment(entitySet));
    
    var request = RequestFactory.Create("GET",
        "http://localhost/api?$top=10&",
        dataOptions => dataOptions.AddModel(routeName, edmModel));
    
    request.ODataFeature().Model = edmModel;
    request.ODataFeature().Path = path;
    request.ODataFeature().PrefixName = routeName;
    
    var oDataQueryContext = new ODataQueryContext(edmModel, typeof(User), new ODataPath());
    var aDataQueryOptions = new ODataQueryOptions<User>(oDataQueryContext, request);
    
    // Act
    PageResult<User> users = _userController.GetAll(aDataQueryOptions);
    

    您将需要帮助类来生成 HttpRequest

    public static class RequestFactory
        {
            /// <summary>
            /// Creates the <see cref="HttpRequest"/> with OData configuration.
            /// </summary>
            /// <param name="method">The http method.</param>
            /// <param name="uri">The http request uri.</param>
            /// <param name="setupAction"></param>
            /// <returns>The HttpRequest.</returns>
            public static HttpRequest Create(string method, string uri, Action<ODataOptions> setupAction)
            {
                HttpContext context = new DefaultHttpContext();
                HttpRequest request = context.Request;
    
                IServiceCollection services = new ServiceCollection();
                services.Configure(setupAction);
                context.RequestServices = services.BuildServiceProvider();
    
                request.Method = method;
                var requestUri = new Uri(uri);
                request.Scheme = requestUri.Scheme;
                request.Host = requestUri.IsDefaultPort ? new HostString(requestUri.Host) : new HostString(requestUri.Host, requestUri.Port);
                request.QueryString = new QueryString(requestUri.Query);
                request.Path = new PathString(requestUri.AbsolutePath);
                
                return request;
            }
    

    取自这里https://github.com/OData/AspNetCoreOData/blob/master/test/Microsoft.AspNetCore.OData.Tests/Extensions/RequestFactory.cs

    希望对遇到同样问题的人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多