[英]How to (should I) mock DocumentClient for DocumentDb unit testing?
[英]DocumentDB Repository Unit testing
我从这篇文章中得到了参考,似乎他们在DocumentDB Repository类的单元测试方面有一个可行的解决方案。
[TestClass]
public class DocumentDBRepositoryShould {
/// <summary>
/// Fake IOrderedQueryable IDocumentQuery for mocking purposes
/// </summary>
public interface IFakeDocumentQuery<T> : IDocumentQuery<T>, IOrderedQueryable<T> {
}
[TestMethod]
public async Task ExecuteQueryAsync() {
//Arrange
var description = "BBB";
var expected = new List<MyDocumentClass> {
new MyDocumentClass{ Description = description },
new MyDocumentClass{ Description = "ZZZ" },
new MyDocumentClass{ Description = "AAA" },
new MyDocumentClass{ Description = "CCC" },
};
var response = new FeedResponse<MyDocumentClass>(expected);
var mockDocumentQuery = new Mock<IFakeDocumentQuery<MyDocumentClass>>();
mockDocumentQuery
.SetupSequence(_ => _.HasMoreResults)
.Returns(true)
.Returns(false);
mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<MyDocumentClass>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);
var client = new Mock<IDocumentClient>();
client
.Setup(_ => _.CreateDocumentQuery<MyDocumentClass>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
.Returns(mockDocumentQuery.Object);
var cosmosDatabase = string.Empty;
var documentsRepository = new DocumentDBRepository<MyDocumentClass>(cosmosDatabase, client.Object);
//Act
var query = documentsRepository.GetQueryable(); //Simple query.
var actual = await documentsRepository.ExecuteQueryAsync(query);
//Assert
actual.Should().BeEquivalentTo(expected);
}
}
基本上,代码是比较查询结果和预期结果。 但我不明白他们从哪里得到查询结果? 他们查询的“假”数据库在哪里? 例如,对于这行代码:
var actual = await documentsRepository.ExecuteQueryAsync(query);
它在调用哪个数据库?
这个单元测试使用Moq来创建一个IFakeDocumentQuery
的模拟对象,它是一个实现IDocumentQuery
的接口。
编写此文件的用户不关心文档客户端将如何返回预期数据。 这就是为什么在这些方面
mockDocumentQuery
.SetupSequence(_ => _.HasMoreResults)
.Returns(true)
.Returns(false);
mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<MyDocumentClass>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);
他/她/他们设置模拟文档查询以在使用任何CancellationToken
调用ExecuteNextAsync
方法时返回特定响应,并在这些行中
client
.Setup(_ => _.CreateDocumentQuery<MyDocumentClass>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
.Returns(mockDocumentQuery.Object);
他/她/他们正在设置创建的文档查询以返回模拟的文档查询对象。
这个想法是单元测试应该与任何外部调用无关,这就是我们在有外部调用时模拟响应的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.