Как нам подменить NSubstitute для Microsoft.Azure.Documents.Resource.ETag?

NiTRiX-Reloaded спросил: 10 мая 2018 в 04:07 в: azure-cosmosdb

Я пытаюсь подделать свойство Get only ETag, используя N Substitute.

Библиотечное пространство имен: Microsoft.Azure.Documents.Resource.ETagAny помощь приветствуется?


1 ответ

Nick Chapsas ответил: 11 мая 2018 в 01:43

Ответ 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 здесь.

Нет другого способа, потому что все внутреннее запечатанное и это класс.

Дополнительное видео по вопросу: Как нам подменить NSubstitute для Microsoft.Azure.Documents.Resource.ETag?

Azure Cosmos db tutorial

From SQL to Azure Cosmos DB - Jimmy Bogard

Explore Azure Cosmos DB : Build 2018