我正在尝试为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);
有什么想法吗?
答案 0 :(得分:0)
您尝试模拟的方法是非虚拟的。您只能在类上模拟抽象方法或模拟类的接口。
https://github.com/Moq/moq4/wiki/Quickstart - 您可以在此处看到IFoo
是一个接口,Bar
和Baz
是具有抽象方法的具体类。
我建议你在这段代码的基础上创建一个抽象。在这种情况下,存储库模式看起来很合适,因为您似乎是持久化数据。这将允许您模拟您在任何地方使用的存储库,例如:在某种服务层。至于测试实际实现(使用Azure SDK的位),我建议编写一个集成测试,其中包括实际将数据保存到Azure中的存储模拟器或存储帐户的依赖性。
答案 1 :(得分:0)
ASDocumentClient不会在客户端周围执行1:1包装,因此测试具有负值(0值+进行测试的成本)。你也不应该对DocumentDB进行单元测试,除非你发现一个特定的问题是微软的工作(可以通过集成测试来获取)
应该测试IDocumentDBRepository,并且可以通过您的包装器界面进行测试。
没有ASDocumentClient / IASDocumentClient包装器来测试存储库是一个不同但有用的问题。