Tôi đang làm việc trên một ứng dụng sẽ được phục vụ chủ yếu dưới dạng API (trừ một vài lượt xem nhỏ, chẳng hạn như phiên/đăng ký, sẽ là "chuẩn"). Tôi thích cách tiếp cận đã được hoàn thành trong Railscast #350: Versioning an API và do đó theo dõi nó. tuyến đường của tôi trông giống như:Cách kiểm tra ràng buộc tuyến với rspec
namespace :api, :defaults => {:format => 'json'} do
scope :module => :v1, :constraints => ApiConstraints.new(:version => 1, :default => false) do
resources :posts, :only => [:create, :show, :destroy, :index]
end
scope :module => :v2, :constraints => ApiConstraints.new(:version => 2, :default => true) do
resources :posts, :only => [:create, :show, :destroy, :index]
end
end
Trong mỗi tuyến đường, Hạn chế của tôi là một ApiConstraints mới phản đối, mà nằm ở thư mục ./lib
tôi. Lớp học trông giống như sau:
class ApiConstraints
def initialize(options)
@version = options[:version]
@default = options[:default]
end
def matches?(req)
@default || req.headers['Accept'].include?("application/vnd.MYAPP.v#{@version}")
end
end
Bây giờ, khi kiểm tra thủ công, mọi thứ hoạt động như mong đợi. Trong API của tôi, tôi có thể có từ 5 đến 10 bộ điều khiển cho mỗi phiên bản và không muốn kiểm tra rằng các ràng buộc API hoạt động cho từng bộ điều khiển riêng lẻ, vì điều đó không có ý nghĩa gì. Tôi đang tìm một tập tin spec để kiểm tra các ràng buộc API của tôi, nhưng tôi không chắc chắn về nơi để đặt spec đó.
Tôi đã thử thêm một tập tin spec/routing/api_spec.rb
để kiểm tra điều này, nhưng nó không hoạt động đúng, vì nó than phiền rằng một số điều không được cung cấp, như vậy:
it "should route an unversioned request to the latest version" do
expect(:get => "/api/posts", :format => "json").to route_to(:controller => "api/v1/posts")
end
ở trên ném một lỗi mặc dù bộ điều khiển phù hợp đúng cách. Lỗi này không thành công với lỗi sau:
The recognized options <{"format"=>"json", "action"=>"index", "controller"=>"api/v1/posts"}>
did not match <{"controller"=>"api/v1/posts"}>,
difference: <{"format"=>"json", "action"=>"index"}>.
Lưu ý rằng bộ điều khiển đã được xác định đúng, nhưng vì tôi không muốn kiểm tra định dạng và hành động trong thử nghiệm này, lỗi này bị lỗi. Tôi muốn có được 3 "kỹ thuật API":
- Nó nên gửi một yêu cầu không phiên bản lên phiên bản mới nhất
- Nó nên mặc định cho định dạng JSON nếu không chỉ định
- Nó sẽ trả về một quy định Phiên bản API khi được yêu cầu
Có ai có kinh nghiệm viết thông số kỹ thuật cho các loại tuyến đường này không? Tôi không muốn thêm thông số kỹ thuật cho mọi bộ điều khiển bên trong API vì chúng không chịu trách nhiệm về chức năng này.
Có, điều này là chính xác. Lý tưởng nhất, tôi muốn ba thử nghiệm trong tệp api spec của tôi, một kiểm tra định dạng mặc định hoạt động, một để kiểm tra xem nó định tuyến đến một bộ điều khiển hợp lệ khi không có phiên bản nào được chỉ định và một để kiểm tra xem nó có định tuyến thích hợp hay không phiên bản IS được chỉ định. –
Vâng, bằng cách sử dụng 'route_to' bạn cần cung cấp các kỳ vọng cụ thể hơn, như' mong đợi (: get => "/api/posts.json"').to route_to (: controller =>" api/v1/posts ",: action => "index",: format => "json") '. Thật không may là không có cách nào xung quanh điều đó với các đối sánh rspec-ray mặc định. – gregates
Vấn đề với điều đó là mọi thông số kỹ thuật sẽ kiểm tra logic từ mọi thông số khác. Đó là cơ bản cán tất cả các thông số kỹ thuật vào một thử nghiệm, đó không phải là lý tưởng. –