如何实例化ResourceResponse <document>

时间:2015-10-21 14:50:33

标签: c# moq azure-cosmosdb

我正在尝试模拟一个返回ResourceResponse<Document>的调用,但我无法实例化该类型。是否有工厂类可以实例化它或以其他方式实现它?

修改

var response = new ResourceResponse<Document>();

  

类型&#39; Microsoft.Azure.Documents.Client.ResourceResponse&#39;没有定义构造函数

3 个答案:

答案 0 :(得分:6)

最新的稳定版Microsoft.Azure.DocumentDB(1.10.0)atm添加了2个构造函数用于模拟。

https://msdn.microsoft.com/en-us/library/azure/dn799209.aspx#Anchor_2

修改

使用Moq你可以这样做:

Mock<IDocumentClient> documentClient = new Mock<IDocumentClient>();
documentClient
    .Setup(dc => dc.ReplaceDocumentAsync(UriFactory.CreateDocumentUri("database", "collection", "id"), object, null) // last parameter are RequestOptions, these are null by default
    .Returns(Task.FromResult(new ResourceResponse<Document>()));

这样我可以检查我的documentClient上的方法是否被调用,如果你想影响文档中返回的内容,你必须创建一个文档,然后关注该文档的ResourceResponse。类似的东西:

var document = new Document();
document.LoadFrom(jsonReader); // the json reader should contain the json of the document you want to return
Mock<IDocumentClient> documentClient = new Mock<IDocumentClient>();
documentClient
    .Setup(dc => dc.ReplaceDocumentAsync(UriFactory.CreateDocumentUri("database", "collection", "id"), object, null) // last parameter are RequestOptions, these are null by default
    .Returns(Task.FromResult(new ResourceResponse<Document>(document)));

答案 1 :(得分:0)

Kinda较晚,但使用Microsoft.Azure.DocumentDB.Core 2.4.2,有一个DocumentClient构造函数,它接受HttpMessageHandler作为参数。这很丑陋(以至于它不值得一票),但是您可以使用它来注入带有状态代码的响应。据我所知,当我这样做时,什么也没有离开我的盒子。

我还必须创建一个仅测试的构造函数,因为我永远不想在运行代码期间使用它。但是,对于那些对直到有更好的库出来之前仍然感兴趣的人来说,都是相关的部分。

创建您的客户

var client = new DocumentClient(host, authText, handler);

在测试中,您可以使用如下模拟的处理程序:

    public static Mock<HttpMessageHandler> CreateHttpMessageHandler(List<HttpResponseMessage> responses)
        {
            var handlerMock = new Mock<HttpMessageHandler>(MockBehavior.Strict);
            handlerMock.Protected()
                .Setup<Task<HttpResponseMessage>>(
                nameof(HttpClient.SendAsync),
                ItExpr.IsAny<HttpRequestMessage>(),
                ItExpr.IsAny<CancellationToken>())
                .ReturnsAsync(() => {
                    var response = responses[0];
                    responses.RemoveAt(0);
                    return response;
                })
                .Verifiable();

            return handlerMock;
        }

我创建了这个响应工厂模拟器

    private HttpResponseMessage Respond(string text)
    {
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            StatusCode = HttpStatusCode.OK,
            Content = new StringContent(text),
        };

        return response;
    }

并使用以下方法设置处理程序:

        var responses = new List<HttpResponseMessage> {
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
        };

...替换为实际调用CosmosDB的Fiddler(或类似)跟踪输出。 FWIW我必须提供我的实际有效载荷的2个副本,作为最后2个响应。显然,这是现状,可能会发生变化,但It worked for me。希望它能为您提供帮助,并期待着一个旨在与SOLID原理进行交互的现代库。

答案 2 :(得分:0)

ResourceResponse class的构造函数包含标记为internal的DocumentServiceResponse参数。

这很不好,因为即使您可以从ResourceReponse创建一个DTO class对象,您也无法设置消耗的RU,响应代码之类的东西,因为它们都来自ResourceResponseBase还将DocumentServiceResponse标记为内部。

请在下面的链接中找到代码

how-to-mock-or-instantiate