DocumentDB存储库单元测试

时间:2018-04-17 20:50:20

标签: c# unit-testing azure repository azure-cosmosdb

我从这个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);

它正在调用哪个数据库?

1 个答案:

答案 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);

他/她/他们正在设置创建的文档查询以返回模拟的文档查询对象。

这个想法是单元测试应该与任何外部呼叫无关,这就是为什么我们在有外部呼叫时嘲笑响应。