【发布时间】:2018-07-24 19:12:43
【问题描述】:
设置如下:
- .NET Standard 2.0 库
- 一个针对它的 NUnit 测试项目,针对 .NETFramework 4.6.1
最新的 VS 2017,最新的 NUnit。
我周末在家一直在做这个项目,将我的工作上传到 git,今天开始下班(我之前已经在这两个地方工作过)。直到现在我才发现项目出了点问题(我不太记得一开始出了什么问题,但问题似乎和我现在一样,稍后描述)。
在摆弄到无法修复的状态后,我完全删除了它并重新克隆了 git repo。
项目编译良好strong>,但在运行时测试抛出“找不到方法”异常。稍微摸索一下,发现问题仅在以下方法的一个重载上表现出来:
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 问题确实让我检查了重载并发现其中一个确实有效。
虽然我还没有像在工作中那样尝试删除并重新安装该项目,但在家里一切仍然正常。这导致了 2 个可能的问题来源:环境,尽管我没有设法找到有意义的差异,或者 git,尽管我对 VS (this one) 使用“库存” git ignore,所以应该没有问题那里。我的项目的基本设置在周末没有改变并且之前工作过,所以最近的摆弄有些东西坏了。
另外,如果我将控制台应用程序(.Net Framework 4.6.1)添加到解决方案并尝试从中调用有问题的方法,它实际上可以正常工作。
如果有帮助,我的项目 github 是 here
有人要求我在 cmets 中调用示例。基本上,我有 2 个具有不同设置的测试夹具类 - 一个用于真正的 API 调用,以便于调试实际使用,另一个用于伪造它,根据良好的测试实践。 作品:
[OneTimeSetUp]
public void Setup()
{
ynabClient = YNABClient.GetInstance();
ynabClient.RefreshAccessToken(ApiKeys.AccessToken);
}
抛出异常:
[OneTimeSetUp]
public void Setup()
{
handler = new StubHandler();
ynabClient = YNABClient.GetInstance(handler);
}
一些研究表明我的问题很可能与 System.Net.Http 与 .NET Framework 和 .NET Standard 的版本差异有关,如果您在谷歌上搜索,这是一个相当普遍的问题。然而,我挖出的例子都没有表现出我的特殊症状,我还不知道该怎么做。以及为什么在我的家用电脑上一切正常。
【问题讨论】:
-
由于问题只发生在运行时,您需要发布您使用反射(或使用
dynamic)调用GetInstance方法的位置。由于某种原因,运行时绑定器无法将参数匹配到静态方法。 -
正如我所说,我从 NUnit 测试项目中调用它。是公开的,不需要反思。虽然我不知道 NUnit 在内部是如何工作的,但那里的一切都很简单。我将添加示例
-
当我运行你的测试时,模拟测试都通过了,但真正的测试都失败了:“YNAB 没有授权我们。访问令牌可以吗?”听起来模拟测试对您来说失败了,我无法用您的代码重现。请尝试将其减少为minimal reproducible example。
-
您的尝试确实验证了问题出在环境上。所有测试都按照它们应该为您执行的操作 - 模拟通过,因为它们没有外部依赖项,而真实的则返回未经授权的异常,因为您没有提供访问密钥。
-
是因为你的框架吗?您的 YNABConnector 是 .NET Standard 2.0,但您的 UnitTest 是 4.6.1。
标签: c# visual-studio-2017 methodnotfound