C# Microsoft.Azure.Documents.Client CreateDocumentQuery Moq

C# Microsoft.Azure.Documents.Client CreateDocumentQuery Moq,c#,.net,moq,C#,.net,Moq,我正在尝试为Microsoft.Azure.Documents.Client CreateDocumentQuery创建moq 我使用类实现创建了一个接口,在该接口中实例化DocumentClient的一个对象并进行相应的调用。这有助于简化最低起订量 代码如下: public interface IASDocumentClient { IOrderedQueryable<T> CreateDocumentQuery<T>(Uri documentCollectio

我正在尝试为Microsoft.Azure.Documents.Client CreateDocumentQuery创建moq

我使用类实现创建了一个接口,在该接口中实例化DocumentClient的一个对象并进行相应的调用。这有助于简化最低起订量

代码如下:

public interface IASDocumentClient
{
    IOrderedQueryable<T> CreateDocumentQuery<T>(Uri documentCollectionUri, FeedOptions feedOptions = null);
}

public class ASDocumentClient : IASDocumentClient
{
    DocumentClient client = null;
    public ASDocumentClient(DocumentClient documentClient)
    {
        this.client = documentClient;
    }


    public IOrderedQueryable<Document> CreateDocumentQuery(Uri documentCollectionOrDatabaseUri, FeedOptions feedOptions = null)
    {
        return client.CreateDocumentQuery(documentCollectionOrDatabaseUri, feedOptions);
    }        

    public IQueryable<T> CreateDocumentQuery<T>(Uri documentCollectionOrDatabaseUri, SqlQuerySpec querySpec, FeedOptions feedOptions = null)
    {
        return client.CreateDocumentQuery<T>(documentCollectionOrDatabaseUri, querySpec, feedOptions);
    }
}




   public class DocumentDBRepositoryUnitTest : IDisposable
    {
        IDocumentDBRepository<TestDocumentDBEntity> documentDBRepository;
        List<TestDocumentDBEntity> items = new List<TestDocumentDBEntity>();

        //Pre-test
        public DocumentDBRepositoryUnitTest()
        {
            Mock<IASDocumentClient> documentClient = new Mock<IASDocumentClient>();

            documentClient.Setup(x => x.CreateDocumentQuery<Document>(It.IsAny<Uri>(), It.IsAny<FeedOptions>())).Returns(queryDocuments);
        }


        //Not working now
        [Fact]
        public void GetItemsAsyncTest()
        {
            //Arrange 

            //Act
            var retTask = documentDBRepository.GetItemsAsync(x => true);

            //Assert
            Assert.NotNull(retTask);
            Assert.NotNull(retTask.Result);
        }

        //Post-test
        public void Dispose()
        {
            items = new List<TestDocumentDBEntity>();
        }
    }


public class DocumentDBRepository<T> : IDocumentDBRepository<T> where T : BaseDocumentDBEntity, new()
{
    private string cosmosDbUri;
    private string cosmosDbAuthKey;
    private string databaseId;
    private string collectionId;
    private IASDocumentClient client=null;

    public DocumentDBRepository(IASDocumentClient client, string databaseId, string collectionId)
    {
        this.client = client;
        this.databaseId = databaseId;
        this.collectionId = collectionId;
        if (!string.IsNullOrEmpty(this.databaseId) && !string.IsNullOrEmpty(this.collectionId))
            Initialize();
    }

    public async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, bool>> predicate)
    {
      IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
          UriFactory.CreateDocumentCollectionUri(this.databaseId, this.collectionId), new FeedOptions { MaxItemCount = -1 })
        .Where(predicate)
        .AsDocumentQuery();

      List<T> results = new List<T>();
      while (query.HasMoreResults)
      {
        results.AddRange(await query.ExecuteNextAsync<T>());
      }

      return results;
    }
}
公共接口IASDocumentClient
{
IOrderedQueryable CreateDocumentQuery(Uri documentCollectionUri,FeedOptions FeedOptions=null);
}
公共类ASDocumentClient:IASDocumentClient
{
DocumentClient=null;
公共ASDocumentClient(DocumentClient DocumentClient)
{
this.client=documentClient;
}
公共IOrderedQueryable CreateDocumentQuery(Uri documentCollectionOrDatabaseUri,FeedOptions FeedOptions=null)
{
返回client.CreateDocumentQuery(documentCollectionOrDatabaseUri,feedOptions);
}        
公共IQueryable CreateDocumentQuery(Uri documentCollectionOrDatabaseUri,SqlQuerySpec querySpec,FeedOptions FeedOptions=null)
{
返回client.CreateDocumentQuery(documentCollectionOrDatabaseUri、querySpec、feedOptions);
}
}
公共类DocumentDBRepositoryUnitTest:IDisposable
{
IDocumentDBRepository documentDBRepository;
列表项=新列表();
//预测试
公共文档DBRepositoryUnitTest()
{
Mock documentClient=new Mock();
documentClient.Setup(x=>x.CreateDocumentQuery(It.IsAny(),It.IsAny())。返回(queryDocuments);
}
//现在不工作
[事实]
public void GetItemsAsyncTest()
{
//安排
//表演
var retTask=documentDBRepository.GetItemsAsync(x=>true);
//断言
Assert.NotNull(retTask);
Assert.NotNull(retTask.Result);
}
//后测试
公共空间处置()
{
项目=新列表();
}
}
公共类DocumentDBRepository:IDocumentDBRepository,其中T:BaseDocumentDBEntity,new()
{
私人字符串cosmosDbUri;
私人字符串cosmosDbAuthKey;
私有字符串数据库ID;
私有字符串集合ID;
私有IASDocumentClient=null;
公共DocumentDBRepository(IASDocumentClient客户端、字符串数据库ID、字符串集合ID)
{
this.client=client;
this.databaseId=databaseId;
this.collectionId=collectionId;
如果(!string.IsNullOrEmpty(this.databaseId)和&!string.IsNullOrEmpty(this.collectionId))
初始化();
}
公共异步任务GetItemsAsync(表达式谓词)
{
IDocumentQuery=client.CreateDocumentQuery(
CreateDocumentCollectionUri(this.databaseId,this.collectionId),新的FeedOptions{MaxItemCount=-1})
.Where(谓词)
.AsDocumentQuery();
列表结果=新列表();
while(query.HasMoreResults)
{
AddRange(wait query.ExecuteNextAsync());
}
返回结果;
}
}
当我运行测试时,它甚至没有触及CreateDocumentQuery的模拟设置:

documentClient.Setup(x=>x.CreateDocumentQuery(It.IsAny(),It.IsAny())。返回(queryDocuments)


有什么想法吗?

您试图模拟的方法是非虚拟的。只能模拟类上的抽象方法或类的接口

-您可以在这里看到,
IFoo
是一个接口,
Bar
Baz
是带有抽象方法的具体类


我建议您在此代码之上创建一个抽象。在这种情况下,存储库模式看起来很合适,因为您似乎在持久化数据。这将允许您模拟您创建的存储库,无论它将在何处使用,例如在某种服务层中。至于测试实际实现(您使用Azure SDK的位置),我建议编写一个集成测试,其中包括实际将数据保存到Azure中的存储模拟器或存储帐户的依赖关系。

ASDocumentClient不做任何操作,它是围绕客户端的1:1包装,因此测试值为负值(0值+进行测试的成本)。您也不应该对DocumentDB进行单元测试,除非您发现一个特定的问题是Microsofts的工作(可以通过集成测试发现)

IDocumentDBRepository应该经过测试,可以通过包装器接口进行测试


没有ASDocumentClient/IASDocumentClient wrappers来测试存储库是一个不同但有用的问题。

看看我最近给出的这个答案,看看它是否适用于您的问题。我尝试了您的答案中的方法。但我得到了以下错误:对象引用未设置为对象的实例。at System.Linq.Queryable.Where[TSource](IQueryable
1 source,Expression
1 predicate)在DocumentDBRepository`1.d_u8.MoveNext()我已经这样做了,但这似乎导致了一些问题。用示例代码更新了上面的代码。