我正在努力使用N Substitute伪造Get only属性 ETag 。
库名称空间:Microsoft.Azure.Documents.Resource.ETag 任何帮助表示赞赏?
答案 0 :(得分:1)
CosmosDB响应是模拟的噩梦。你不能用模拟库来做。
但是我在Cosmonaut
中使用了一种解决方法您可以使用此方法来创建带反射的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;
}
只需执行resource.SetPropertyValue("_etag", "Yourguid")
即可。
你可以看到它与Moq here
一起使用的方式没有别的办法,因为一切都是内部密封的,而且他们是一个班级。