繁体   English   中英

DocumentDB存储库单元测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM