c# - 未找到 WebApi Controller 测试方法

标签 c# testing asp.net-web-api2

我有一个在 .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/

相关文章:

c# - 在多线程场景中从 List<T> 添加/删除特定项目的最佳方法是什么

c# - 如何编写返回实例集合的类方法

c# - 具有多个 View (图标、详细信息、列表等)的 Mono GTK# View 列表

c# - 防止 Web API 2 输入上的 SQL 注入(inject)

c# - 无法解析操作路由

c# - 路由附加事件 WPF/MVVM 后丢失 EventArgs

python - 如何测试依赖于 boto 和 Amazon AWS 服务的模块?

java - 使用反射从列表中获取对象

java - 使用 JUnit 测试 Swing 应用程序

asp.net - 带有 Facebook 访问 token 的 MVC 5 Web API 到 RegisterExternal,无需 Cookie