【问题标题】:Microsoft.Azure.Documents.Client CreateDocumentQuery MoqMicrosoft.Azure.Documents.Client CreateDocumentQuery 最小起订量
【发布时间】:2018-02-08 21:09:31
【问题描述】:

我正在尝试为 Microsoft.Azure.Documents.Client CreateDocumentQuery 创建一个最小起订量

我创建了一个带有类实现的接口,我在其中实例化了 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;
    }
}

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

documentClient.Setup(x => x.CreateDocumentQuery(It.IsAny(), It.IsAny())).Returns(queryDocuments);

有什么想法吗?

【问题讨论】:

  • 看看我最近给出的这个答案,看看它是否适用于你的问题。 stackoverflow.com/a/48432085/5233410
  • 我尝试了您回答中的方法。但我收到此错误:对象引用未设置为对象的实例。在 System.Linq.Queryable.Where[TSource](IQueryable1 source, Expression1 谓词) 在 DocumentDBRepository`1.d__8.MoveNext()

标签: c# .net moq


【解决方案1】:

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

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

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

【讨论】:

  • 我已经这样做了,但这似乎导致了一些问题。用示例代码更新了上面的代码。
【解决方案2】:

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

IDocumentDBRepository 应该经过测试,并且可以通过您的包装接口进行测试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 2017-03-21
    • 1970-01-01
    • 2012-08-09
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多