Microsoft.Azure.Documents.Client CreateDocumentQuery Moq

时间:2018-02-08 21:09:32

标签: c# .net moq

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

我创建了一个带有类实现的接口,我在其中实例化DocumentClient的对象并进行相应的调用。这是为了方便moq。

以下是代码:

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;
    }
}

当我运行测试时,它甚至没有联系到CreateDocumentQuery的模拟设置:

documentClient.Setup(x =&gt; x.CreateDocumentQuery(It.IsAny(),It.IsAny()))。返回(queryDocuments);

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

https://github.com/Moq/moq4/wiki/Quickstart - 您可以在此处看到IFoo是一个接口,BarBaz是具有抽象方法的具体类。

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

答案 1 :(得分:0)

ASDocumentClient不会在客户端周围执行1:1包装,因此测试具有负值(0值+进行测试的成本)。你也不应该对DocumentDB进行单元测试,除非你发现一个特定的问题是微软的工作(可以通过集成测试来获取)

应该测试IDocumentDBRepository,并且可以通过您的包装器界面进行测试。

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