2013-02-08 3 views
0

저는 Rspec 사양 대부분을 작성했지만 중요한 문제에 직면하고 있습니다. 모든 경로에 라우팅 제한 조건을 설정했습니다 (자체적으로 논쟁의 여지가 있음). 별도의 IpAddress 모델에 저장되어있는 IP 주소를 허용 한 관리자 만 내 응용 프로그램의 특정 영역에 액세스 할 수 있습니다.Rspec가 라우팅 제약을 무시합니다

간단히 말해서 필자는 사양 내에서 모든 것을 자유롭게 액세스 할 수 있도록 제한 모델을 모방하거나 스터핑하려고합니다.

내 제약 조건은 다음과 같습니다

class IpAddressConstraint 
    def initialize 
    @ips = IpAddress.select('number') 
    end 

    def matches?(request) 
    if @ips.find_by_number(request.remote_ip).present? || Rails.env.test? #<- temporary solution 
     true 
    else 
     if @current_backend_user.present? 
     backend_user_sign_out 
     else 
     raise ActionController::RoutingError.new('Not Found') 
     end 
    end 
    end 
end 

MyApp::Application.routes.draw do 
    constraints IpConstraint.new do 
    #all routes 
    end 
end 

내가 RSpec에이 라우팅 제약 조건을 테스트 할 수있는 최선의 방법은 무엇입니까? 현재 조건문을 추가 했으므로 테스트 환경에있는 경우 이러한 제약 조건을 모두 건너 뛸 수 있습니다. 어떻게 든이 제약 조건을 시뮬레이션 할 수 있다면 더 좋을 것입니다.

+0

허용되는 IPS 목록에 127.0.0.1/32를 추가 하시겠습니까? 네가 카피 바라 같은 것을 사용한다고 가정 할 때? – Doon

+0

필자는 IP를위한 별도의 모델을 가지고 있지만 로그인 만하면 액세스 할 수 있습니다. 새로운 Ip_address.number (필자의 경우 127.0.0.1)를 만들 수있는 도우미를 작성할 수 있다면 좋을 것입니다. 그렇게 확고한 제약이 있기는하지만 디자인에 대한 잘못된 결정 일 수 있습니다. –

+0

IpAddress라는 IP 모델이 있습니다. 경로를 통과하는 스펙보다 먼저'IpAddress.create (number : '127.0.0.1')와 같은 작업 만하면됩니다. 컨트롤러/등을 통해 해당 Object/레코드를 생성 할 필요가 없습니다. – Doon

답변

1

어떻게 이런 일에 대해 :

describe "Some Feature" do 

context "from allowed ip" do 
    before(:each) {IpAddress.create(number: '127.0.0.1')} 

    it "should allow access to foo" do 
    ..... 
    end 

    .... 
end 

context "from non allowed ip" do 
    it "shouldn't allow access to foo" do 
    ..... 
    end 
end 

는 그런 다음 IP 주소가 도우미 모듈 또는 더 복잡한 설정을 할 필요가 특히 함수 중 하나를 만들 추출 할 수 있습니다. 항상 거기에 있기를 원한다면 spec_helper 파일 설정 블록에 추가하여 각/모든 스펙 이전에 실행하면되지만, 인증되지 않은 ips를 성공적으로 차단했다는 것을 테스트하는 것이 더 힘들어 질 것입니다.

+0

이 솔루션은 매우 직관적 인 것처럼 보입니다. 사실, 나는 이미 이것을 시도했지만 여전히 문제가 발생했다고 생각합니다. 거친 유형일지도 모르다, 나는 월요일에 그것을 다시 검사 할 것이다 (나는 그 응용 프로그램을 직장에서만 가지고있다). 이 솔루션이 작동하면 귀하의 대답을 수락합니다. 나는 내 테스트 환경에서 라우팅 제약 조건을 건너 뛸 수있는 임시 해결책을 정말로 좋아하지 않는다. –

+0

그것이 작동하지 않아야하는 이유 (유명한 마지막 단어)가 표시되지 않습니다. 그러나 문제가 발생할 경우이를 포함 시키십시오. 아마도 도움이 될 것입니다. – Doon

+0

당신의 권리를 희망합시다. 어떤 문제가 발생하면 오류 로그를 게시 할 것입니다. –