在这里只看到了两个问题,一个没有回答,一个是无法使用的答案(也许我只是没有得到它)。我想嘲笑这个:
var eventsFeed = this.documentClient.CreateDocumentQuery(this.collectionUri,
sqlExpression, feedOptions).AsDocumentQuery();
var events = await eventsFeed.ExecuteNextAsync(cancellationToken);
Run Code Online (Sandbox Code Playgroud)
我似乎只能收到此错误:
无法将“System.Linq.EnumerableQuery”类型的对象转换为“Microsoft.Azure.Documents.Linq.IDocumentQuery”
这里有一个可能的答案:
无法将“System.Linq.EnumerableQuery”类型的对象转换为“Microsoft.Azure.Documents.Linq.IDocumentQuery”
但是我找不到示例中使用的类型 JTokenEx 并且没有解释如何编写模拟代码?
理想情况下,我想返回一些模拟结果,以便我可以测试 ExecuteNextAsync。
作为参考,这是我发现与之相关的另一个问题,但同样没有得到回答:
如何(我应该)模拟 DocumentClient 以进行 DocumentDb 单元测试?
任何帮助将不胜感激。谢谢
我正在编写单元测试DocumentDBRepository但是我得到了一个空引用异常.我使用Moq框架和XUnit.
这是我DocumentDBRepository课堂上的方法.
public class DocumentDBRepository<T> : IRepository<T> where T: class
{
private static string DatabaseId;
private static string CollectionId;
private static IDocumentClient client;
public DocumentDBRepository(IDocumentClient documentClient, string databaseId, string collectionId)
{
DatabaseId = databaseId;
CollectionId = collectionId;
client = documentClient;
CreateDatabaseIfNotExistsAsync().Wait();
CreateCollectionIfNotExistsAsync().Wait();
}
public async Task<IDocumentQuery<T>> GetQuery(Expression<Func<T, bool>> predicate)
{
try
{
IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
.Where(predicate)
.AsDocumentQuery();
return query;
}
catch (Exception e) …Run Code Online (Sandbox Code Playgroud) 我需要能够模拟IDocumentQuery,以便能够测试查询文档集合并可能使用谓词来过滤它们的代码:
IQueryable<T> documentQuery = client
.CreateDocumentQuery<T>(collectionUri, options);
if (predicate != null)
{
documentQuery = documentQuery.Where(predicate);
}
var list = documentQuery.AsDocumentQuery();
var documents = new List<T>();
while (list.HasMoreResults)
{
documents.AddRange(await list.ExecuteNextAsync<T>());
}
Run Code Online (Sandbox Code Playgroud)
我使用/sf/answers/3493821341/的答案来编写以下方法:
public static IDocumentClient Create<T>(params T[] collectionDocuments)
{
var query = Substitute.For<IFakeDocumentQuery<T>>();
var provider = Substitute.For<IQueryProvider>();
provider
.CreateQuery<T>(Arg.Any<Expression>())
.Returns(x => query);
query.Provider.Returns(provider);
query.ElementType.Returns(collectionDocuments.AsQueryable().ElementType);
query.Expression.Returns(collectionDocuments.AsQueryable().Expression);
query.GetEnumerator().Returns(collectionDocuments.AsQueryable().GetEnumerator());
query.ExecuteNextAsync<T>().Returns(x => new FeedResponse<T>(collectionDocuments));
query.HasMoreResults.Returns(true, false);
var client = Substitute.For<IDocumentClient>();
client
.CreateDocumentQuery<T>(Arg.Any<Uri>(), Arg.Any<FeedOptions>())
.Returns(query);
return client;
}
Run Code Online (Sandbox Code Playgroud)
只要不使用过滤,它就可以正常工作IQueryable.Where。 …