当我向TestServer发出请求时,我得到了404响应。我无法理解为什么,因为我使用相同的配置为普通服务器,它的工作原理。为了发出请求,我使用了TestServer.HttpClient。
答案 0 :(得分:4)
对我而言,我的测试并不知道它正在测试的东西。我认为与测试共享项目的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'是您要测试的东西的装配名称(右键单击项目 - &gt;属性,它位于第一个选项卡的顶部)
这让你超越了这个障碍。
第二个障碍让我以这种方式测试了一个破坏者。我终于有了一个非404响应,现在它是500.我知道我的URL是正确的,因为稍微更改它们会使它们再次成为404。问题是没有办法调试它。由于您只是引用正在测试的程序集,因此无法进入它并设置断点,而不是。有什么好处的测试无法告诉你为什么会失败?特别令人讨厌的是它在IIS中运行良好。所以我不相信这是一个很好的模拟我的代码如何在野外运行。