Microsoft.Owin.Testing.TestServer 404 未找到

Microsoft.Owin.Testing.TestServer 404 not found

当我向 TestServer 发出请求时,我收到 404 响应。而且我不明白为什么,因为我对普通服务器使用相同的配置并且它可以工作。为了发出请求,我使用 TestServer.HttpClient.

对我来说,我的测试不知道它正在测试的东西。我认为将项目的 WebApiConfig 与测试共享就足够了,但所做的只是给它空的路由信息​​。它没有告诉测试它应该测试什么。所以它只是去 http://localhost/api/controller/action 并得到一个 404 就像你现在在浏览器中尝试的一样。

关于如何建立这个丢失的连接几乎没有任何内容。最近的是 http://www.juliencorioland.net/archives/using-owin-to-test-your-web-api-controllers ,但它掩盖了最重要的部分——如何告诉测试要测试什么!

示例代码如下所示:

class OwinTestConf
{
  public void Configuration(IAppBuilder app)
  {
 HttpConfiguration config = new HttpConfiguration();
    config.Services.Replace(typeof(IAssembliesResolver), new TestWebApiResolver());
    config.MapHttpAttributeRoutes();
    app.UseWebApi(config);
}

}

那个 TestWebApiResolver 是什么?好吧,你创建一个继承自 DefaultAssembliesResolver 的 class,然后覆盖 GetAssemblies()。在那里你加载你要测试的东西。这里有一个很好的 post 说明如何做到这一点:http://www.strathweb.com/2013/08/customizing-controller-discovery-in-asp-net-web-api/

从那里复制粘贴好东西,您的覆盖将如下所示:

public class MyAssembliesResolver : DefaultAssembliesResolver
{
  public override ICollection<Assembly> GetAssemblies()
 {
    ICollection<Assembly> baseAssemblies = base.GetAssemblies();
    List<Assembly> assemblies = new List<Assembly>(baseAssemblies);
    var controllersAssembly = Assembly.Load("MyAssembly");
    baseAssemblies.Add(controllersAssembly);
    return assemblies;
  }
}

...其中 'MyAssembly' 是您要测试的程序集名称(右键单击项目 -> 属性,它位于第一个选项卡的顶部)

这会让你越过障碍。

第二个障碍使我无法通过这种方式进行测试。我终于得到了一个非 404 响应,现在是 500。我知道我的 URL 是正确的,因为稍微改变它们会使它们再次成为 404。问题是没有办法调试它。由于您只是引用正在测试的程序集,因此无法进入它并设置断点等等。无法告诉您失败原因的测试有什么用?特别烦人的是它在 IIS 中运行良好。所以我已经失去了信任,认为这是一个很好的模拟我的代码将如何 运行 在野外。