1

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

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

4

1 回答 1

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 一起使用

没有其他办法,因为一切都是内部密封的,它们是一个类。

于 2018-06-04T15:15:44.493 回答