public static Mock <IDocumentClient> CreateDocumentClient <T>(T[] collectionDocuments) where T : class, new() { var client = new Mock <IDocumentClient>(MockBehavior.Strict); var mockOrderedQueryable = new Mock <IOrderedQueryable <T> >(MockBehavior.Strict); var provider = new Mock <IQueryProvider>(MockBehavior.Strict); var dataSource = collectionDocuments.AsQueryable(); // Dynamic query for the "select" calls that filter by field names provider .Setup(_ => _.CreateQuery <object>(It.IsAny <Expression>())) .Returns((Expression expression) => { var mockDocumentQuery = new Mock <IFakeDocumentQuery <object> >(MockBehavior.Strict); var query = new EnumerableQuery <object>(expression); // This converts the anonymous types back to typed values. var result = query.Select(item => GetItemFromDynamic <T>(item)).ToList(); var response = new FeedResponse <T>(result); mockDocumentQuery.Setup(_ => _.Provider) .Returns(provider.Object); mockDocumentQuery.Setup(_ => _.Expression) .Returns(expression); mockDocumentQuery .SetupSequence(_ => _.HasMoreResults) .Returns(true) .Returns(false); mockDocumentQuery .Setup(_ => _.ExecuteNextAsync <T>(It.IsAny <CancellationToken>())) .ReturnsAsync(response); mockDocumentQuery .Setup(_ => _.GetEnumerator()) .Returns(query.AsEnumerable().GetEnumerator()); return(mockDocumentQuery.Object); }); // Typed query for the initial "where clauses" provider .Setup(_ => _.CreateQuery <T>(It.IsAny <Expression>())) .Returns((Expression expression) => { var mockDocumentQuery = new Mock <IFakeDocumentQuery <T> >(MockBehavior.Strict); var query = new EnumerableQuery <T>(expression); //var response = new FeedResponse<T>(query); var response = ToFeedResponse(query); // Required for selects to pass to the above more generic version mockDocumentQuery.Setup(_ => _.Provider) .Returns(provider.Object); mockDocumentQuery.Setup(_ => _.Expression) .Returns(expression); mockDocumentQuery .SetupSequence(_ => _.HasMoreResults) .Returns(true) .Returns(false); mockDocumentQuery .Setup(_ => _.ExecuteNextAsync <T>(It.IsAny <CancellationToken>())) .ReturnsAsync(response); mockDocumentQuery .Setup(_ => _.GetEnumerator()) .Returns(query.AsEnumerable().GetEnumerator()); return(mockDocumentQuery.Object); }); mockOrderedQueryable.Setup(x => x.Provider).Returns(provider.Object); mockOrderedQueryable.Setup(x => x.Expression).Returns(() => dataSource.Expression); client.Setup(c => c.CreateDocumentQuery <T>(It.IsAny <Uri>(), It.IsAny <FeedOptions>())) .Returns(mockOrderedQueryable.Object); client.Setup(c => c.CreateDocumentAsync( It.IsAny <Uri>(), It.IsAny <T>(), null, false, default(CancellationToken))) .Returns((Uri uri, T item, RequestOptions ro, bool b, CancellationToken ct) => GetDocumentForItem(item)); client.Setup(c => c.CreateDocumentAsync( It.IsAny <Uri>(), It.IsAny <AuditEntry <T> >(), null, false, default(CancellationToken))) .Returns((Uri uri, AuditEntry <T> item, RequestOptions ro, bool b, CancellationToken ct) => GetDocumentForItem(item)); mockOrderedQueryable .Setup(_ => _.GetEnumerator()) .Returns(dataSource.AsEnumerable().GetEnumerator()); client.Setup(c => c.ReadDocumentAsync(It.IsAny <Uri>(), null, default(CancellationToken))).Returns((Uri item, RequestOptions ro, CancellationToken ct) => GetDocumentByIdForItem(item, mockOrderedQueryable.Object)); client.Setup(c => c.UpsertDocumentAsync( It.IsAny <Uri>(), It.IsAny <T>(), null, false, default(CancellationToken))) .Returns((Uri uri, T item, RequestOptions ro, bool b, CancellationToken ct) => GetDocumentForItem(item)); return(client); }