加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

无法将类型为“System.Linq.EnumerableQuery”的对象强制转换为

发布时间:2020-12-14 01:38:22 所属栏目:Windows 来源:网络整理
导读:我有一个使用以下方法的类,并使用Moq作为单元测试框架.我该如何模仿以下内容: FeedOptions feedOptions = new FeedOptions { MaxItemCount = 1000 }; var query = await _storeAccessClient.CreateDocumentQueryAsyncCustomEntity(_collectionLink,feedOpti
我有一个使用以下方法的类,并使用Moq作为单元测试框架.我该如何模仿以下内容:

FeedOptions feedOptions = new FeedOptions
        {
            MaxItemCount = 1000
        };

        var query = await _storeAccessClient.CreateDocumentQueryAsync<CustomEntity>(_collectionLink,feedOptions)
            .Where(c => c.DataType == _dataType)
            .OrderBy(c => c.StartTime,sortOrder)
            .AsDocumentQuery()
        .ExecuteNextAsync<CustomEntity>();

        List<CustomEntity> result = query.ToList<CustomEntity>();

任何帮助是极大的赞赏 !!

解决方法

您所要做的就是创建EnumerableQuery类的包装器,它继承自IQueryable和IDocumentQuery,如下所示:

internal class MockEnumerableQuery : IDocumentQuery<JTokenEx>,IOrderedQueryable<JTokenEx>
{
        public IQueryable<JTokenEx> List;
        private readonly bool bypassExpressions;


        public MockEnumerableQuery(EnumerableQuery<JTokenEx> List,bool bypassExpressions = true)
        {
            this.List = List;
            this.bypassExpressions = bypassExpressions;
        }


        public IEnumerator<JTokenEx> GetEnumerator()
        {
            return List.GetEnumerator();
        }


        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }


        public Expression Expression => List.Expression;

        public Type ElementType => typeof(JTokenEx);


        public IQueryProvider Provider => new MockQueryProvider(this,bypassExpressions);


        public void Dispose()
        {
        }


        public Task<FeedResponse<TResult>> ExecuteNextAsync<TResult>(CancellationToken token = new CancellationToken())
        {
            BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
            FeedResponse<JToken> feed = Activator.CreateInstance(typeof(FeedResponse<JToken>),flags,null,new Object[] { List.Select(j => (JToken) j),new NameValueCollection(),false,null},null) 
                as FeedResponse<JToken>;

            return Task.FromResult(feed as FeedResponse<TResult>);
        }


        public Task<FeedResponse<dynamic>> ExecuteNextAsync(CancellationToken token = new CancellationToken())
        {
            throw new NotImplementedException();
        }


        public bool HasMoreResults { get; }
    }


    class MockQueryProvider : IQueryProvider
    {
        private readonly MockEnumerableQuery mockQuery;
        private readonly bool bypassExpressions;

        public MockQueryProvider(MockEnumerableQuery mockQuery,bool byPassExpressions)
        {
            this.mockQuery = mockQuery;
            this.bypassExpressions = byPassExpressions;
        }


        public IQueryable CreateQuery(Expression expression)
        {
            throw new NotImplementedException();
        }


        public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
        {
            if (!bypassExpressions)
            {
                mockQuery.List = mockQuery.List.Provider.CreateQuery<TElement>(expression) as IQueryable<JTokenEx>;
            }

            return (IQueryable<TElement>)mockQuery;
        }


        public object Execute(Expression expression)
        {
            throw new NotImplementedException();
        }


        public TResult Execute<TResult>(Expression expression)
        {
            throw new NotImplementedException();
        }
    }

现在你的mock返回EnumerableQuery,你返回这个MockEnumerableQuery类,你应该很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读