【发布时间】:2014-07-24 19:34:58
【问题描述】:
我正在尝试为使用属性路由的 Web Api 2 路由创建集成测试。我在解决方案中有 2 个项目,一个 Web Api 2 项目(本示例为自托管),其中包含一个包含以下路由的控制器和一个用于运行测试的 MSTest 项目。
控制器:
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
[Route("products")]
[HttpGet]
public IEnumerable<Product> GetAllProducts()
{
return products;
}
}
主要:
static void Main(string[] args)
{
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.MapHttpAttributeRoutes();
using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
Console.WriteLine("Press Enter to quit.");
Console.ReadLine();
}
}
当我在调试 Web Api 项目时从浏览器/提琴手点击它时,上面的路由运行得很好。我已经尝试过自托管和 IIS,并且在这种情况下都可以工作。
在我的 MSTest 项目中,我像这样配置自托管服务器:
[TestMethod]
public void TestMethod1()
{
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.MapHttpAttributeRoutes();
config.EnsureInitialized();
using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
var client = new HttpClient();
var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://localhost:8080/products")).Result;
var code = response.StatusCode;
server.CloseAsync().Wait();
}
}
总是找不到路线。此外 config.Routes 不包含我的路线。我尝试实现一个自定义 IAssemblyResolver 以尝试让 MapHttpAttributeRoutes() 在包含控制器的程序集中找到启用属性的路由,但没有运气。
任何帮助将不胜感激!
*简化测试示例
【问题讨论】:
-
你的 global.cs 是什么样的?
-
包含 Global.asax.cs 代码。这是你的意思吗?我的理解是 Application_Start() 永远不会在 MSTest 项目的上下文中触发。
-
好的,谢谢。现在提供 WebApiConfig.Register 的样子。
-
你能提供你试图调用的控制器吗?类的声明和你想要调用的函数。
-
好的,我包含了 WebApiConfig.Register
标签: mstest asp.net-web-api2 asp.net-web-api-routing