我正在尝试模拟一个返回ResourceResponse<Document>
的调用,但我无法实例化该类型。是否有工厂类可以实例化它或以其他方式实现它?
修改
var response = new ResourceResponse<Document>();
类型&#39; Microsoft.Azure.Documents.Client.ResourceResponse&#39;没有定义构造函数
答案 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标记为内部。
请在下面的链接中找到代码