2014-07-22 22 views
8

Tôi có bộ điều khiển có thuộc tính định tuyến. điều khiển này không thành công trong một thử nghiệm đơn vị bởi vì con đường không thể được tìm thấy:Kiểm tra đơn vị với định tuyến dựa trên thuộc tính

A route named 'Values' could not be found in the route collection

Đây là phương pháp điều khiển:

[Route("api/values", Name="ApiValues")] 
[HttpGet] 
public HttpResponseMessage Get() 
{ 
    urlHelper.Link("ApiValues", new {}); 
} 

Đây là bài kiểm tra đơn vị của tôi:

var valuesController = new ValuesController() 
{ 
    Request = new HttpRequestMessage 
    { 
     RequestUri = new Uri("http://localhost/api/") 
    }, 
    Configuration = new HttpConfiguration() 
}; 

valuesController.Get(); 

Tôi cũng đã cố thêm điều này vào bài kiểm tra đơn vị:

valuesController.Configuration.MapHttpAttributeRoutes(); 
valuesController.Configuration.EnsureInitialized(); 

Nhưng điều đó không giúp được gì.

+0

Đó là kỳ lạ mà tôi không thể repro vấn đề của bạn. Mọi thứ hoạt động tốt trên máy của tôi. Phiên bản webapi bạn đã sử dụng là gì? Bạn đã cung cấp tất cả mã thử nghiệm của mình chưa? Tôi nghĩ rằng các bài kiểm tra đơn vị sẽ không chạy về phần định tuyến thuộc tính. –

+0

"urlHelper" trong tác vụ điều khiển của bạn là gì? Bạn có thể chia sẻ đầy đủ không? Cảm ơn –

Trả lời

11

Tôi đã nhận lỗi giống nhau:

A route named 'Values' could not be found in the route collection. 

Nhưng cuộc thử nghiệm đơn vị đi trên máy tính của tôi sau khi tôi thêm MapHttpAttributeRoutesEnsureInitialized:

var valuesController = new ValuesController() 
{ 
    Request = new HttpRequestMessage { RequestUri = new Uri("http://localhost/api/") }, 
    Configuration = new HttpConfiguration() 
}; 

valuesController.Configuration.MapHttpAttributeRoutes(); 
valuesController.Configuration.EnsureInitialized(); 

valuesController.Get(); 

Bạn có thể cung cấp với nhiều thông tin để repro vấn đề hoặc kiểm tra xem có bất kỳ sự khác biệt nào giữa mã thử nghiệm của chúng tôi không?

+0

Tôi đã kiểm tra lại mọi thứ, bởi vì bạn đã nói nó hoạt động. Và nó cũng hoạt động trên máy của tôi. Cảm ơn! – user369117

1

Thay vì gọi trực tiếp bộ điều khiển trong kiểm tra Đơn vị, hãy sử dụng các phương thức Trợ giúp để nhận Controller contextAction context. Điều này sẽ tránh việc sử dụng các

valuesController.Configuration.MapHttpAttributeRoutes(); 
valuesController.Configuration.EnsureInitialized(); 

Tham khảo lời giải thích tuyệt vời của Filip W. trên Testing routes in Web API 2

Các vấn đề liên quan