如何(我应该)模拟DocumentClb以进行DocumentDbunit测试?从新的CosmosDb模拟器我得到了一个存储库来执行基本的documentdb操作,这个存储库被注入到其他类中。我想对基本查询进行单元测试。publicclassDocumentDBRepositorywhereT:class{//细节省略...publicIQueryableGetQueryable(){return_client.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri(_databaseId,_collectionId),newFeedOptions{MaxItemCount=-1,Enable)CrossPartition=true}publicasyncTaskExecuteQueryAsync(IQueryablequery){IDocumentQuerydocumentQuery=query.AsDocumentQuery();列表结果=newList();while(documentQuery.HasMoreResults){results.AddRange(reawaitdocumentQuery.Execute()next)Next};结果;这个存储库需要一个文档客户端才能工作,它也被注入到构造函数中。publicDocumentDBRepository(stringdatabaseId,IDocumentClientclient){_client=client;_databaseId=数据库Id;_collectionId=GetCollectionName();我最初的方法是使用CosmosDb模拟器,但这需要一个我不喜欢的模拟器来运行,并且会使测试速度变慢。我的第二种方法是尝试使用文档客户端的模拟。vardata=newList{newMyDocumentClass{Description="BBB"},newMyDocumentClass{Description="ZZZ"},}.AsQueryable().OrderBy(q=>q.Description);varclient=newMock();client.As().Setup(foo=>foo.CreateDocumentQuery(It.IsAny(),It.IsAny())).Returns(数据);DocumentDBRepositoryrepo=newDocumentDBRepository(cosmosDatabase,client.Object);使用此存储库的代码如下所示:varquery=_documentsRepository.GetQueryable().Where(d=>d.Description=description).OrderByDescending(d=>d.description).Take(100);//执行查询异步失败。varresult=await_documentsRepository.ExecuteQueryAsync(query);它失败是因为存储库试图将IQueryable转换为IDocumentQuery对象,该对象非常特定于DocumentDbapi(请参阅上面的方法ExecuteQueryAsync)。后来,它HasMoreResults它执行HasMoreResults方法。所以问题是,即使我模拟.asDocumentQuery()返回我的对象??,我也不知道如何为HasMoreResults和ExecuteNextAsync提供结果,以便我的单元测试有意义。我的第三个选择是直接模拟我的存储库而不是DocumentClient对象。在我看来,这会更简单,但我没有测试很多DocumentDbapi。关键是您正在调用CreateDocumentQuery,虽然显示为返回IOrderedQueryable,但它包装了也从IDocumentQuery派生的结果,这将允许.AsDocumentQuery()工作。现在通常你不应该嘲笑你不拥有的东西。但是,在这种情况下,如果您希望ExecuteQueryAsync完成,您可以创建允许测试完成的假抽象。以下示例显示了如何完成。以上是C#学习教程:How(shouldI)simulateDocumentClbforDocumentDbunittesting?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——[TestClass]publicclassDocumentDBRepositoryShould{//////FakeIOrderedQueryableIDocumentQueryformockingpurposes///publicinterfaceIFakeDocumentQuery:IDocumentQuery,IOrderedQueryable{}[TestMethod]publicasyncTaskExecuteQueryAsync(){//安排vardescription="BBB";varexpected=newList{newMyDocumentClass{Description=description},newMyDocumentClass{Description="ZZZ"},newMyDocumentClass{Description="AAA"},newMyDocumentClass{Description="CCC"},};varresponse=newFeedResponse(预期);varmockDocumentQuery=newMock>();mockDocumentQuery.SetupSequence(_=>_.HasMoreResults).Returns(true).Returns(false);mockDocumentQuery.Setup(_=>_.ExecuteNextAsync(It.IsAny())).ReturnsAsync(响应);varclient=newMock();客户端.Setup(_=>_.CreateDocumentQuery(It.IsAny(),It.IsAny())).Returns(mockDocumentQuery.Object);varcosmosDatabase=string.Empty;vardocumentsRepository=newDocumentDBRepository(cosmosDatabase,client.Object);//行为varquery=documentsRepository.GetQueryable();//简单查询。varactual=awaitdocumentsRepository.执行查询异步(查询);//断言actual.Should().BeEquivalentTo(expected);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: