首页 > 解决方案 > 运行单元测试时出现 System.TypeAccessException

问题描述

我正在使用 xunit 编写一些单元测试,这些单元测试将测试HttpClient我编写的子类,该子类也使用DelegateHandler. 我正在尝试使用 aHttpMessageHandler来模拟我通过在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()

我已经尝试为我的所有调用添加安全属性,包括运行单元测试的方法(来自这个问题:Attempt by security transparent method X to access security critical method Y failed

我还通过完全删除委托处理程序并将消息处理程序直接传递给MyHttpClient构造函数进行了测试,并且效果很好。

我还尝试将以下属性的任意数量/组合添加到AssemblyInfo.cs文件中:

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

我还能做些什么来解决访问异常吗?我希望能够测试委托处理程序。

更新:无论我是否传入消息处理程序,我似乎都收到了这个异常。只需调用该CreatePipeline()方法就会引发此异常。

标签: c#exception.net-corexunit.net

解决方案


推荐阅读