我从这个post得到了参考,似乎他们在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);
它正在调用哪个数据库?
答案 0 :(得分:2)
此单元测试使用Moq创建IFakeDocumentQuery
的模拟对象,这是一个实现IDocumentQuery
的接口。
写这篇文章的用户并不关心文档客户端如何返回预期的数据。这就是为什么在这些行中
mockDocumentQuery
.SetupSequence(_ => _.HasMoreResults)
.Returns(true)
.Returns(false);
mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<MyDocumentClass>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);
他/她/他们设置模拟文档查询,以便在使用任何ExecuteNextAsync
并在这些行中调用CancellationToken
方法时返回特定响应
client
.Setup(_ => _.CreateDocumentQuery<MyDocumentClass>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
.Returns(mockDocumentQuery.Object);
他/她/他们正在设置创建的文档查询以返回模拟的文档查询对象。
这个想法是单元测试应该与任何外部呼叫无关,这就是为什么我们在有外部呼叫时嘲笑响应。