Microsoft.Azure.Documents.Client CreateDocumentQuery Moq



我正在尝试为microsoft.azure.documents.client createCumentQuery

创建一个订单

我创建了一个具有类实现的接口,在该接口中,我实例化了文档的对象并进行相应的调用。这是为了为此提供帮助。

这是代码:

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

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

documentClient.setup(x => x.CreatedOcumentQuery(it.isany((,it.isany((((。返回(queryDocuments(;

有什么想法?

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

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

我建议您在此代码的顶部创建一个抽象。在这种情况下,存储库模式似乎是合适的,因为您似乎是持久数据。这将使您能够嘲笑您创建的存储库,例如使用该存储库。在某种服务层中。至于测试实际实现(您使用Azure SDK的位(,我建议编写一个集成测试,其中包含此依赖项实际保存数据,无论是存储模拟器还是Azure中的存储帐户。

asdocumentClient在客户端周围没有任何作用1:1包装器,因此测试具有负值(0值 测试的成本(。除非找到Microsofts作业的特定问题(可以通过集成测试来挑选(,否则您也不应该单位测试文档DB

iDocumentDbrepository应该进行测试,并且可以通过包装器接口进行测试。

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

最新更新