设置如下:
最新的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上正常运行。
答案 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
您的代码将正常工作,没有错误。
但是在您的基本代码中,我仍然喜欢此代码:
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>
我仍然不理解为什么项目在某些机器上可以正常工作。