저는 주로 API로 제공되는 응용 프로그램 ("표준"이 될 세션/등록과 같은 몇 가지 사소한보기 제외)에서 작업하고 있습니다. 나는 Railscast #350: Versioning an API에서 완성 된 접근법을 좋아하고 그렇게 따라 갔다. 각 경로에서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
, 내 제약은 새로운 ApiConstraints 내 ./lib
폴더에 위치한, 객체입니다 내 경로는 다음과 같다. 이 클래스는 다음과 같습니다.
이제 테스트 할 때 모든 것이 예상대로 작동합니다. 내 API에서는 버전 당 5 ~ 10 개 정도의 컨트롤러가있을 수 있으며 각 컨트롤러마다 API 제약 조건이 작동하는지 테스트하고 싶지는 않습니다. 내 API 제약 조건을 테스트하는 하나의 spec 파일을 찾고 있는데 그 스펙을 어디에 넣을 지 확신 할 수 없습니다.
나는 일을 테스트하는 spec/routing/api_spec.rb
파일을 추가 해봤지만 몇 가지가과 같이 제공되지 않는다는 불평으로는 제대로 작동하지 않습니다 :
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
을 위 비록 오류가 발생합니다 컨트롤러가 올바르게 일치합니다. 컨트롤러가 제대로 결정되었는지
가The recognized options <{"format"=>"json", "action"=>"index", "controller"=>"api/v1/posts"}>
did not match <{"controller"=>"api/v1/posts"}>,
difference: <{"format"=>"json", "action"=>"index"}>.
공지 사항,하지만 난이 시험의 형식과 행동, 그것은 오류를 테스트하지 않기 때문에 : 그것은 다음과 같은 오류와 함께 실패합니다. 나는 3 "API 사양"있을 싶습니다
- 그것은해야 경로 것도 그것은 지정된 반환해야
- 지정되지 않은 경우
- 그것은 JSON 형식으로 기본합니다 최신 버전으로 버전없는 요청 요청시 API 버전
누구나 이러한 종류의 경로에 대한 사양을 작성해 본 경험이 있습니까? 이 기능을 담당하지 않으므로 API 내부의 모든 컨트롤러에 대한 사양을 추가하고 싶지 않습니다. ActionDispatch::Assertions::RoutingAssertions#assert_recognizes
에
네, 맞습니다. 이상적으로, 나는 api 스펙 파일에서 3 가지 테스트를 원한다. 하나는 기본 포맷이 작동하는지 테스트한다. 하나는 버전이 지정되지 않았을 때 유효한 컨트롤러로 라우트하는 것을 테스트하고, 다른 하나는 올바른 버전으로 라우트하는 것을 테스트한다. 버전 IS가 지정되었습니다. –
글쎄,'route_to'를 사용하면'expect (: get => "/api/posts.json"').to route_to (: controller =>"api/v1/posts "와 같은 더 구체적인 기대치를 제공해야합니다. action => "index", : format => "json")'. 불행하게도 기본 rspec-rails matchers를 사용하는 방법은 없습니다. – gregates
그 문제는 모든 사양이 다른 모든 사양에서 로직을 테스트한다는 것입니다. 그것은 본질적으로 모든 사양을 하나의 테스트로 압연하고 있으며, 이는 이상적이지 않습니다. –