Как мы можем заменить фальшивку для Microsoft.Azure.Documents.Resource.ETag? - PullRequest
0 голосов
/ 03 июня 2018

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

Пространство имен библиотеки: Microsoft.Azure.Documents.Resource.ETag Любая помощь приветствуется?

1 Ответ

0 голосов
/ 04 июня 2018

Ответ 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;
    }

Просто выполните resource.SetPropertyValue("_etag", "Yourguid"), и оно будет работать.

Вы можете увидеть, как оно использовалось вместе с Moq здесь

Другого пути нет, потому что все внутренне запечатано и они класс.

...