C# 如何实例化ResourceResponse<;文件>;

C# 如何实例化ResourceResponse<;文件>;,c#,moq,azure-cosmosdb,C#,Moq,Azure Cosmosdb,我试图模拟一个返回ResourceResponse的调用,但无法实例化该类型。是否有一个工厂类可以实例化它,或者以其他方式进行实例化 编辑 var response=newresourcesponse() 类型“Microsoft.Azure.Documents.Client.ResourceResponse”未定义构造函数 最新稳定版本的Microsoft.Azure.DocumentDB(1.10.0)atm添加了2个构造函数,用于模拟 编辑 使用最小起订量,您可以执行以下操作: Mock

我试图模拟一个返回
ResourceResponse
的调用,但无法实例化该类型。是否有一个工厂类可以实例化它,或者以其他方式进行实例化

编辑

var response=newresourcesponse()

类型“Microsoft.Azure.Documents.Client.ResourceResponse”未定义构造函数


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

编辑

使用最小起订量,您可以执行以下操作:

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>()));
    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;
        }
        var responses = new List<HttpResponseMessage> {
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
        };
Mock documentClient=new Mock();
文档客户端
.Setup(dc=>dc.replaceDocumentSync(UriFactory.CreateDocumentUri(“数据库”、“集合”、“id”))对象,null)//最后一个参数是RequestOptions,默认为null
.Returns(Task.FromResult(new ResourceResponse());
通过这种方式,我可以检查是否调用了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)));
var document=新文档();
document.LoadFrom(jsonReader);//json读取器应该包含要返回的文档的json
Mock documentClient=new Mock();
文档客户端
.Setup(dc=>dc.replaceDocumentSync(UriFactory.CreateDocumentUri(“数据库”、“集合”、“id”))对象,null)//最后一个参数是RequestOptions,默认为null
.返回(Task.FromResult(新资源响应(文档));

有点晚,但是在Microsoft.Azure.DocumentDB.Core 2.4.2中有一个
DocumentClient
构造函数,它接受
HttpMessageHandler
作为参数。它很难看(因此值得否决)但你可以用它来给回复注入状态码。据我所知,当我这么做的时候,我的盒子里什么都没有留下

我还必须创建一个只测试的构造函数,因为在运行代码时我永远不想使用它

创建你的客户

var client = new DocumentClient(host, authText, handler);
在测试中,您可以使用模拟处理程序,如下所示:

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>()));
    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;
        }
        var responses = new List<HttpResponseMessage> {
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
        };
并使用如下内容设置处理程序:

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>()));
    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;
        }
        var responses = new List<HttpResponseMessage> {
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
           Respond("{ ... }"),
        };
var响应=新列表{
回应(“{…}”),
回应(“{…}”),
回应(“{…}”),
回应(“{…}”),
};

用小提琴手(或类似工具)替换
跟踪对您的CosmosDB的实际调用的输出。FWIW我必须提供我的实际负载的2个副本作为最终的2个响应。这显然是原样,可能会发生变化,但
它对我有效。
。希望它对您有所帮助,并期待一个设计为与可靠原则接口的现代库。

ResourceResponse类的构造函数包含标记为内部的DocumentServiceResponse参数

这是不好的,因为即使您可以从
DTO类创建
ResourceReponse
对象,您也无法设置RUs、响应代码和其他几乎所有的内容,因为它们都来自ResourceResponseBase,而ResourceResponseBase也将DocumentServiceResponse标记为internal

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


定义“无法”。你的问题不是针对这个类的。你是说它是密封的,并且有一个私有的、受保护的或内部的构造函数吗?然后搜索它。无论如何,为一个只有密封类的web服务公开一个客户端库是有点愚蠢的,怪微软。是的,这是一个工厂类实例化它吗?我可能会后退一步nd询问您是否真的需要传递
ResourceResponse
?也许您只需要模拟本地对象而不是MS位?@DavidG是的,如果无法获得
ResourceResponse
的实例,这将是下一步。这很有趣,但并非完全有用,因为DocumentDB APIurn“资源响应”-因此,没有办法利用您引用的方法。理想情况下,我希望它们返回类似IResourceResponse的内容。好吧,接口确实是理想的。但是您可以实例化ResourceResponse对象,并将其用作DocumentClient模拟调用的响应。您在问题中说您不能执行<代码>新资源响应()
但是随着更新,你可以。我会用一个例子来编辑我的答案。如果你喜欢初始化jsonreader的例子,我可以制作一个。这真的让我很困扰。为什么他们不能在接口已经存在的情况下使用接口作为返回类型?我需要模拟
ResourceResponse
aka
。StatusCode
pr的结果属性。不能这样做,因为
StatusCode
不是
virtual
(再见,NSubstitute)加上
IDocumentClient
根本不返回接口:(
Task CreateAttachmentAsync(…)
)您可以实例化
ResourceResponse
,但不能更改
.StatusCode
属性(或任何其他属性),因为它只有一个getter。当代码试图访问它时,它总是抛出
NullReferenceException