Azure cosmosdb 我们如何为Microsoft.Azure.Documents.Resource.ETag替换fake?

Azure cosmosdb 我们如何为Microsoft.Azure.Documents.Resource.ETag替换fake?,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我正在努力使用N替换来伪造Get-only属性ETag 库命名空间:Microsoft.Azure.Documents.Resource.ETag 感谢您的帮助?CosmosDB的回应简直是一场噩梦。您不能使用模拟库来执行此操作 不过,我在中使用了一个变通方法来模拟 您可以使用此方法创建带有反射的DocumentServiceResponse。这意味着您可以使用.SetPropertyValue方法设置etag值 public static ResourceResponse<T> C

我正在努力使用N替换来伪造Get-only属性ETag

库命名空间:Microsoft.Azure.Documents.Resource.ETag
感谢您的帮助?

CosmosDB的回应简直是一场噩梦。您不能使用模拟库来执行此操作

不过,我在中使用了一个变通方法来模拟

您可以使用此方法创建带有反射的DocumentServiceResponse。这意味着您可以使用
.SetPropertyValue
方法设置etag值

public static ResourceResponse<T> CreateResourceResponse<T>(T resource, HttpStatusCode statusCode) where T : Resource, new()
    {
        resource.SetResourceTimestamp(DateTime.UtcNow);
        var resourceResponse = new ResourceResponse<T>(resource);
        var documentServiceResponseType = Type.GetType("Microsoft.Azure.Documents.DocumentServiceResponse, Microsoft.Azure.DocumentDB.Core, Version=1.9.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

        var flags = BindingFlags.NonPublic | BindingFlags.Instance;

        var headers = new NameValueCollection {{"x-ms-request-charge", "0"}};


        var arguments = new object[] { Stream.Null, headers, statusCode, null };

        var documentServiceResponse = Activator.CreateInstance(documentServiceResponseType, flags, null, arguments, null);

        var responseField = typeof(ResourceResponse<T>).GetField("response", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

        responseField.SetValue(resourceResponse, documentServiceResponse);

        return resourceResponse;
    }
publicstaticresourcesponse createresourcesponse(T resource,HttpStatusCode statusCode),其中T:resource,new()
{
SetResourceTimestamp(DateTime.UtcNow);
var resourceResponse=新的resourceResponse(资源);
var documentServiceResponseType=Type.GetType(“Microsoft.Azure.Documents.DocumentServiceResponse,Microsoft.Azure.DocumentDB.Core,版本=1.9.1.0,区域性=中立,PublicKeyToken=31bf3856ad364e35”);
var flags=BindingFlags.NonPublic | BindingFlags.Instance;
var headers=newnamevalueCollection{{“x-ms-request-charge”,“0”};
var arguments=newobject[]{Stream.Null,headers,statusCode,Null};
var documentServiceResponse=Activator.CreateInstance(documentServiceResponseType,标志,null,参数,null);
var responseField=typeof(ResourceResponse).GetField(“response”,System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
responseField.SetValue(resourceResponse、documentServiceResponse);
返回资源响应;
}
只要执行
resource.SetPropertyValue(“\u etag”,“Yourguid”)
就可以了

你可以看到它是如何与最小起订量一起使用的


没有其他方法,因为所有东西都是内部密封的,它们是一个类。

它是在接口上声明的还是作为虚拟属性声明的?我正在尝试测试ETag get only属性-。由于此值是在real Azure Cosmos Db操作期间生成的,因此在单元测试期间,此字段返回null。我想换一些东西,以便有更多的报道已尝试记录1.ETag.Returns(“12345”);-但没有按预期工作。它是在接口上声明的还是作为虚拟属性声明的?我这样问是因为NSubstitute只能替换接口上的成员或类的虚拟成员。如果所讨论的属性都不是,则不能使用NSubstitute执行此操作。相反,您可能希望将其抽象起来,将其放在您可以控制的抽象层后面。