为 .NET 5 Core 控制器单元测试模拟或创建实用的 ODataQueryOptions

Gal*_*kin 3 .net c# asp.net-core-webapi .net-5

我正在将现有的 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);
Run Code Online (Sandbox Code Playgroud)

如果有人可以向狙击手提供如何处理类似问题并能够测试控制器的信息,我将非常感激。

Gal*_*kin 9

最后,我结束了这件事。

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

public PageResult<User> GetAll(ODataQueryOptions<User> odataQuery) 
Run Code Online (Sandbox Code Playgroud)

单元测试

// 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);
Run Code Online (Sandbox Code Playgroud)

您将需要辅助类来生成 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;
        }
Run Code Online (Sandbox Code Playgroud)

它是从这里获取的https://github.com/OData/AspNetCoreOData/blob/master/test/Microsoft.AspNetCore.OData.Tests/Extensions/RequestFactory.cs

我希望它能帮助其他面临同样问题的人

  • 我认为当前版本中“PrefixName”已更改为“RoutePrefix”,“dataOptions.AddModel”已更改为“dataOptions.AddRouteComponents” (2认同)