2017-04-22 70 views
0

我有一個具有以下方法的類,並且使用Moq作爲單元測試框架。我怎樣才能嘲笑以下內容:無法將類型爲「System.Linq.EnumerableQuery」的對象轉換爲鍵入'Microsoft.Azure.Documents.Linq.IDocumentQuery

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>(); 

任何幫助都很受讚賞!

回答

0

所有你需要做的就是創建一個圍繞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), 0, 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(); 
     } 
    } 

現在,在您的模擬將返回EnumerableQuery,你回到這個MockEnumerableQuery類,你應該是好的。

相關問題