如何实例化resourcerresponsedocument>

本文关键字:resourcerresponsedocument 实例化 | 更新日期: 2023-09-27 18:18:44

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

编辑

var response = new ResourceResponse<Document>();

类型为"Microsoft.Azure.Documents.Client"。ResourceResponse'没有定义构造函数

如何实例化resourcerresponsedocument>

最新稳定版本Microsoft.Azure.DocumentDB(1.10.0)增加了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上的方法是否被调用,如果你想影响文档中返回的内容,你必须创建一个文档,然后创建该文档的resourcerresponse。比如:

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

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

这是不好的,因为即使你可以从你的DTO class创建一个ResourceReponse对象,你不能设置像RUs消耗的东西,响应代码和几乎任何其他东西,因为它们都来自ResourceResponseBase,其中也有DocumentServiceResponse标记为内部。

请在下面的链接找到代码

how-to-mock-or-instantiate

有点晚了,但是在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("{ ... }"),
        };

...替换为您的Fiddler(或类似的)跟踪输出,该输出来自对CosmosDB的实际调用。我不得不提供我的实际有效载荷的2个副本作为最后的2个响应。这显然是现状,可能会发生变化,但It worked for me。希望它能帮助你,并期待一个现代的库设计与SOLID原则的接口。

相关文章:
  • 没有找到相关文章