如何实例化resourcerresponsedocument>
本文关键字:resourcerresponsedocument 实例化 | 更新日期: 2023-09-27 18:18:44
我试图模拟返回ResourceResponse<Document>
的调用,但我无法实例化该类型。是否有一个工厂类可以实例化它或其他方式这样做?
编辑
var response = new ResourceResponse<Document>();
类型为"Microsoft.Azure.Documents.Client"。ResourceResponse'没有定义构造函数
最新稳定版本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原则的接口。