2013-03-25 3 views
2

일부 기능을 갖춘 기본 컨트롤러가 있습니다. 기본 컨트롤러는 외부에서 액세스 할 수 없으며 해당 라우팅과 일치하지 않습니다.기본 (초록) 컨트롤러를 테스트하십시오.

그런 다음 컨트롤러를 다른 컨트롤러로 확장하여 추가 기능을 추가하고 경로를 추가하기 위해 각 컨트롤러에 3 가지 방법을 정의하기 위해 컨트롤러를 3 개 확장했습니다.

나는 기본 컨트롤러를 테스트 할 수 있지만, 해당 작업에 대한 경로 (어떤 경로 오류가 일치하지 않습니다)이 없기 때문에 나는

post :index 

할 수 없습니다

내가 추가하지 않으 그 3 개의 관제사 중 한 관제사에 대한 시험. 관제사가 많이 바뀌기 때문에 (관제사는 3 주간의 캠페인 중 사용 된 후 삭제됨).

일부 코드 ... :

class SchoolCampaignController < CampaignController 
    def campaign_name 
    'school' 
    end 

    def campaign_url 
    school_url 
    end 
end 

그 컨트롤러가 기본적으로 있습니다

기본 컨트롤러의 accesible 컨트롤러의

class CampaignController < ApplicationController 
    def index 
    #some code... 
    end 

    def campaign_name 
    raise('campaign_name missing') 
    end 

    def campaign_url 
    raise('campaign_url missing') 
    end 

    #more actions.... 

end 

한 CampaignController, SchoolCampaignController

그 그러나 때때로 내가 필요 기본 동작 중 하나를 재정의하십시오.

그래서, 내가 뭘 잘못하고 있니? CampaignController를 제대로 테스트하려면 어떻게해야합니까?

편집 : 나는 오류가 발생하는 두 가지 방법을 테스트하고 싶지 않아, 내가 예를 들어 인덱스 또는

내가 "응답 시도했습니다 (도시하지 않음)에 다른 작업의 일부를 테스트 할 = controller.index "하지만 이전 필터를 호출하지 않고 응답은 http 응답이 아니라 단지 그 명령의 출력입니다 (나는 response ...와 같은 기대를 할 수 없습니다 render_template (xxxx)))

EDIT 2 : 이전의 (: all) 블록에서 테스트 한 경로를 작성한 후 라우팅에 문제가 없지만 현재는 존재하지 않는 뷰에 대한 오류가 발생합니다 (각각의 접근 가능한 컨트롤러는 모든 뷰를 구현하지만, 추상화 t 하나는 비공개 임)

+0

은'컨트롤러의 캠페인 ... 다음 deleted' 삼주와시 사용 - 아마 데이터 코드가 아닌해야 뭔가처럼 나에게 소리. –

+0

코렐 헤인즈가 "빠른 테스트"비디오에서와 같은 방식으로 컨트롤러의 기능을 PORO로 분해하고 그 기능을 테스트 할 수 있는지 궁금합니다. http://www.youtube.com/watch?v=bNn6M2vqxHE –

+0

Jason, 컨트롤러가 삭제되지 않고 영원히 살고 있다고 상상해보십시오. 라우트/뷰가없는 추상 컨트롤러에서 공유 코드를 테스트하고 싶습니다. 해당 비디오가 표시되어 도움이 되길 바랍니다. – arieljuod

답변

4

렌더링 된 뷰가 아닌 assigns, sessiondb 변경 사항을 테스트 할 예정입니다. 테스트 용으로 추상 컨트롤러의 경로를 다시 그릴 수 있습니다 (예제는 https://gist.github.com/zilkey/543300입니다).

가 렌더링되는 어떤 뷰의 문제를 피해 갈 수있는 방법으로, 당신은 각각 get, post, put 또는 노보기 발견 된 오류를 구출 블록 delete (나는에 작은 도우미 함수를 써서 둘러싸고 제안 이 작업을 수행). 컨트롤러가보기를 마지막 단계로 렌더링하면 할당, 세션 및 DB 변경 사항을 계속 확인할 수 있습니다.

대안은 추상 컨트롤러의 특정 인스턴스에 대한 테스트를 작성하고 컨트롤러 이름과 필요한 모든 데이터를 분석하는 것입니다. 그렇게하면 작동하지 않는 컨트롤러에 대한 기능 테스트 문제가 없으며 3 주마다 테스트를 쉽게 다시 작성할 수 있습니다.

+0

예, 그렇지 않습니다. 보기를 테스트하고, 과제와 그 내용을 테스트하고 싶습니다. 나는 예외에서 구조의 그 아이디어를 진짜로 좋아했다! 나는 그것이 내가 필요로하는 것 같아요, 잠시 후에 시도해 보겠습니다. 작동한다면이 대답을 받아 들일 것입니다. – arieljuod

+0

완벽 : D, thanks! – arieljuod

+0

기꺼이 도와 드리겠습니다! – Hbcdev

0

익명 컨트롤러 테스트를 사용할 수 있습니다.여기에 잘 설명되어 있습니다 : https://relishapp.com/rspec/rspec-rails/v/3-6/docs/controller-specs/anonymous-controller.

이전에 Rails.application.routes.draw do처럼 라우트 원숭이 패치가 필요하지 않습니다. 예를 들어

:

describe BaseController, type: :controller do 
    controller do 
    def index 
     render text: "Hello World" 
    end 
    end 

    it "returns 200" do 
    get :index 
    expect(response).to have_http_status 200 
    end 
end