我有一个在 .NET Framework 4.6.2 上运行的非常简单的 WebAPI 2 Controller ,它看起来像这样:
[RoutePrefix("Invitations")]
public class InvitationsController : CqrsApiController
{
[HttpPost, Route("Clients/{id:long}/Actions/Cancel")]
public IHttpActionResult PostClientInvitationCancel(long id, [FromBody] ClientInvitationCancelCommand command)
{
Execute(command);
return SeeOther("Invitations/Clients/{0}", id);
}
}
并且正在尝试为其编写一个 NUnit 测试,如下所示:
[TestFixture]
public class WhenExecutingAValidCommand
{
[Test]
public void ItShouldReturnARedirect()
{
var dispatcher = Substitute.For<ICqrsDispatcher>();
var urlHelper = Substitute.For<UrlHelper>();
urlHelper.Link(Arg.Any<string>(), Arg.Any<object>()).Returns("https://tempuri.org/");
var sut = new InvitationsController(dispatcher);
sut.Request = new HttpRequestMessage();
sut.Configuration = new HttpConfiguration();
sut.Url = urlHelper;
var response = sut.PostClientInvitationCancel(1, new ClientInvitationCancelCommand());
response.Should().BeOfType<SeeOtherRedirectResult>();
}
}
```
但是,当我运行测试时,出现以下错误:
System.MissingMethodException : Method not found: 'Void System.Web.Http.ApiController.set_Request(System.Net.Http.HttpRequestMessage)'.
at ApiProjectTests.InvitationsControllerTests.WhenExecutingAValidCommand.ItShouldReturnARedirect()
相同的代码似乎在基于 .NET Framework 4.5.1 的类似项目中运行良好,所以我想知道这里是否存在某种 DLL 问题。 System.Web.Http
使用 Microsoft.AspNet.WebApi.Core.5.2.3
,而 System.Net.Http
来自GAC(嗯,C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
更准确地说)。
更新:如果我尝试调试单元测试,错误发生在我什至进入方法之前。因此,尽管 VS2017 可以很好地编译测试,但当测试运行器启动时,一切都会崩溃。对我来说听起来更像是 DLL hell 。
更新 2:如果我注释掉请求的设置,那么我可以调试到测试方法中。如果我然后放置一个断点,然后使用立即窗口直接设置请求属性,它就可以工作,并且不会出现找不到方法错误。我还禁用了 Resharper 并使用 VS2017 的测试资源管理器来运行测试,以防 R# 正在缓存某些内容,但这没有任何区别。
最佳答案
看起来我的问题确实是 DLL hell ,更具体地说是 https://github.com/dotnet/corefx/issues/25773 引用的 DLL hell .该问题是由其他 NuGet 包引起的,这些包包含对较新版本的 System.Net.Http (4.2.0.0) 的引用。当前的解决方案似乎是添加绑定(bind)重定向以将程序集版本降级到预期版本 (4.0.0.0),但到目前为止这对我没有帮助。
对我有用的解决方案是安装最新的 System.Net.Http NuGet 包,并在我的测试项目中使用程序集绑定(bind)重定向以确保它使用 4.2.0.0 版本而不是 4.0.0.0。
关于c# - 未找到 WebApi Controller 测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653013/