找不到重载的方法

时间:2018-07-23 14:31:38

标签: c# visual-studio-2017 methodnotfound

设置如下:

  • .NET Standard 2.0库
  • 针对它的NUnit测试项目,目标是.NETFramework 4.6.1

最新的VS 2017,最新的NUnit。

我周末在家一直在从事该项目的工作,将我的工作上传到git,今天开始工作(之前我已经在两个地方工作过)。直到现在,我才发现该项目出了点问题(我不太记得一开始的问题是什么,但是似乎问题与我现在遇到的问题相同,将在后面描述)。

在摆弄到无法修复的状态之后,我将其完全删除,并重新克隆了git repo。

项目可以很好地编译,但是在运行时测试会引发“找不到方法”异常。稍加摸索,发现问题仅在以下方法的一次重载时出现:

    public static YNABClient GetInstance(HttpMessageHandler _handler)
    {
        if (instance is null)
        {
            instance = new YNABClient(_handler);
        }

        return instance;
    }

    public static YNABClient GetInstance() => GetInstance(new HttpClientHandler());

没有参数的一个很好,有参数的一个没有。删除和添加库作为对测试的引用,同时删除和添加测试和库项目。我在互联网上发现的针对类似情况的其他解决方案均与ASP.NET MVC有关,尽管我的问题this确实使我检查了过载并发现其中一个确实有效。

尽管我还没有像我在工作中那样尝试删除并重新安装该项目,但在家里一切仍然可以正常工作。这导致了两种可能的问题根源:环境(虽然我没有设法找到有意义的区别)或git(尽管我对VS使用了“ stock” git忽略(this one),所以应该那里有问题。我的项目的基本设置在周末期间没有更改,并且在以前可以正常工作,因此最近的麻烦有所改变。

此外,如果我将控制台应用程序(.Net Framework 4.6.1)添加到解决方案并尝试从中调用有问题的方法,则它实际上可以正常工作。

如果这有帮助,我的项目github是here

有人要求我在评论中举一些例子。基本上,我有2个Test Fixture类,它们具有不同的设置-根据良好的测试实践,一个类用于真正的API调用,以简化调试实际使用的情况,而另一类则是伪造的。 作品:

    [OneTimeSetUp]
    public void Setup()
    {
        ynabClient = YNABClient.GetInstance();
        ynabClient.RefreshAccessToken(ApiKeys.AccessToken);
    }

引发异常:

    [OneTimeSetUp]
    public void Setup()
    {
        handler = new StubHandler();
        ynabClient = YNABClient.GetInstance(handler);
    }

随便看看,我的问题很可能与.NET Framework和.NET Standard的System.Net.Http版本控制不一致有关,如果用Google搜索,这是一个相当普遍的问题。但是,我所挖掘的所有示例都没有表现出我的特定症状,并且我不确定该怎么做。以及为什么一切都可以在我的家用PC上正常运行。

3 个答案:

答案 0 :(得分:0)

您遇到的问题是您的GetInstance方法接受HttpMessageHandler作为参数,并且在test中您正在传递HttpClientHandler对象。因此,您已经声明了一个参数,但是在调用该方法时提供了不同的对象。

答案 1 :(得分:0)

我的环境中出现此错误:

  

严重性代码描述项目文件行抑制状态   错误CS0433类型'HttpMessageHandler'在两个目录中都存在   'System.Net.Http,版本= 4.2.0.0,文化=中性,   PublicKeyToken = b03f5f7f11d50a3a'和'System.Net.Http,   版本= 4.0.0.0,文化=中性,PublicKeyToken = b03f5f7f11d50a3a'

您的YNABConnector是.NET Standard 2,但单元测试是4.6.1,它们对同一程序集使用不同的签名。

这里是要测试的官方文件: https://github.com/nunit/docs/wiki/.NET-Core-and-.NET-Standard

  1. 创建了.NET Core库(请注意:通过以上链接不能为.NET Standard库),
  2. 在此处复制测试代码,
  3. 按照官方文档添加参考,

您的代码将正常工作,没有错误。

但是在您的基本代码中,我仍然喜欢此代码:

public class YNABClient
{
    private static YNABClient instance;

    private HttpClient client;

    private HttpMessageHandler handler;

    private YNABClient(HttpMessageHandler _handler = null)
    {
        handler = _handler ?? new HttpClientHandler();
        client = new HttpClient(_handler);
    }

    public static YNABClient GetInstance(HttpMessageHandler _handler = null)
    {
        return instance ?? (instance = new YNABClient(_handler));
    }

    ......
}

答案 2 :(得分:0)

因此,事实证明,正如DongDong所建议的那样,问题确实出在.NET Framework和.NET Standard之间的接口上。问题并不在于它们确实不兼容,也不是Test项目需要一些其他的依赖关系,而是它们随System.Net.Http的不同版本一起提供。

由于未显示任何可见错误,从而阻碍了诊断。但是,更改参数类型表明确实存在问题,仅是来自该命名空间的类。

诊断问题的另一个问题是,该项目在某些机器上运行正常(我的家用PC和Daisy Shipton的评论都来自问题)。

但是,在确定问题的根源之后,我首先可以搜索该库存在的问题,并最终在.NET github上发现了一系列不兼容的问题。

我尝试了在这些情况下使用的解决方案,并在该库的具体版本中添加了“绑定重定向”,此后它可以正常工作。我将重定向添加到我的Tests项目的app.config中。供参考,它看起来像这样:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>

我仍然不理解为什么项目在某些机器上可以正常工作。