我们如何为Microsoft.Azure.Documents.Resource.ETag进行NSubstitute假冒?

时间:2018-06-03 17:47:53

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我正在努力使用N Substitute伪造Get only属性 ETag

库名称空间:Microsoft.Azure.Documents.Resource.ETag 任何帮助表示赞赏?

1 个答案:

答案 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

一起使用的方式

没有别的办法,因为一切都是内部密封的,而且他们是一个班级。