当我向 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
的类,然后覆盖 GetAssemblies()
。在那里你加载你要测试的东西。这里有一篇关于如何执行此操作的好帖子: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 中运行良好。因此,我不再相信这是对我的代码如何在野外运行的良好模拟。
关于c# - 未找到 Microsoft.Owin.Testing.TestServer 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36508092/