System.TypeAccessException при запуске модульного теста - PullRequest
0 голосов
/ 12 июня 2018

Я использую xunit для написания некоторых модульных тестов, которые будут тестировать подкласс HttpClient, который я написал, который также использует DelegateHandler.Я пытаюсь использовать HttpMessageHandler, чтобы высмеивать ответы, которые я получу от звонков Get / Post на HttpClient.Я передаю обработчик сообщений в конструктор моего обработчика удаления через вызов HttpClientHandler.CreatePipeline().Однако, когда я запускаю модульный тест, я получаю следующее исключение:

System.TypeAccessException : Attempt by security transparent method 'System.Net.Http.HttpClientFactory.CreatePipeline(System.Net.Http.HttpMessageHandler, System.Collections.Generic.IEnumerable`1<System.Net.Http.DelegatingHandler>)' to access security critical type 'System.Net.Http.HttpMessageHandler' failed.
   Stack Trace:
        at System.Net.Http.HttpClientFactory.CreatePipeline(HttpMessageHandler innerHandler, IEnumerable`1 handlers)

Мой конструктор выглядит так:

    public MyHttpClient(HttpMessageHandler handler) :
        base(HttpClientFactory.CreatePipeline(
            new HttpClientHandler(),
            new[]
            {
                new MyDelegateHandler(handler)
            }))
    { }

Конструктор для моего обработчика делегата:

    public MyDelegateHandler(HttpMessageHandler messageHandler) : 
        base(messageHandler)
    { }

И некоторый код из моего модульного теста:

        var handler = new MyMessageHandler("response content");
        MyHttpClient client = new MyHttpClient(handler);
        var task = client.GetAsync("https://example.com");

(обратите внимание, что исключение происходит до того, как я позвоню GetAsync())

Я попытался добавить атрибуты безопасности для всехмои вызовы, включая метод, запускающий модульное тестирование (из этого вопроса: Попытка прозрачного метода безопасности X для доступа к критическому методу безопасности Y завершилась неудачно )

Я также протестировал, удаливполностью делегировать обработчик и передать обработчик сообщений непосредственно в конструктор MyHttpClient, и это прекрасно работает.

Я также попытался добавить любое число / комбинацию следующих атрибутов в файлы AssemblyInfo.cs:

[assembly: SecurityRules(SecurityRuleSet.Level1)]
[assembly: AllowPartiallyTrustedCallers]
[assembly: SecurityTransparent()]

Что еще я могу сделать, чтобы обойти исключение доступа?Я хотел бы иметь возможность проверить обработчик делегата.

ОБНОВЛЕНИЕ: Похоже, я получаю это исключение, независимо от того, передаю ли я обработчик сообщений или нет.Простой вызов метода CreatePipeline() вызывает это исключение.

...