2013-03-26 3 views
3

테스트 프레임 워크에 FactoryGirl 및 Rspec을 사용하고 있습니다. 나는 validates_presence_of 검증을 가진 모델을 가지고있다.Rspec 테스트 필수 매개 변수

describe "with invalid params" do 
    it "assigns a newly created but unsaved disease as @disease" do 
    # Trigger the behavior that occurs when invalid params are submitted 
    Disease.any_instance.stub(:save).and_return(false) 
    post :create, :disease => {} 
    assigns(:disease).should be_a_new(Disease) 
    end 
end 

편집 : diseases_controller.rb

# POST /diseases 
# POST /diseases.xml 
def create 
    @disease = Disease.new(disease_params) 

    respond_to do |format| 
    if @disease.save 
     format.html { redirect_to(@disease, :notice => 'Disease was successfully created.') } 
     format.xml { render :xml => @disease, :status => :created, :location => @disease } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @disease.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

private 
def disease_params 
    params.require(:disease).permit(:name, :omim_id, :description) 
end 

이 테스트는 어떻게 내 응용 프로그램이 작동 작동하지 않습니다 기본 RSpec에 프레임 워크는 테스트가 포함되어 있습니다. 오히려 잘못된 게시물에 새로운 질병을 돌아보다가 오류를 반환 :

Required parameter missing: disease 

질문 # 1 : 나는 RSpec에이 게시물을하지 반환되는 내용을보고하는 방법을 모르겠어요. 이 경우 response 개체가 만들어지지 않은 것 같습니다. assigns(:disease) 인쇄 할 때 아무 것도 포함되어 있지 않습니다. 빈 데이터 (올바른 URL 게시가 수행해야하는)가있는 올바른 URL에 cURL 게시물을 제출하여 이전에 게시 한 오류 메시지가 표시되지만 Rspec이 수신 한 정보를 얻는 방법을 모르겠습니다. 게시물 진술서.

질문 # 2 : 발생해야하는 응답을 제대로 테스트하려면 어떻게해야합니까? 필요한 매개 변수가 없다는 오류 메시지가 표시됩니다.

편집 : 내 컨트롤러가 새로운 질병을 유발해야한다는 것을 나타내는 것으로 보이지만 테스트가 실패합니다. 웹 사이트에서 필수 매개 변수가 누락 된 질병을 제출하려고 시도하면 "이름은 비워 둘 수 없습니다"라는 플래시 알림이 표시됩니다. rspec에서 어떻게 테스트하는지 모르겠습니다.

편집 # 2 : 위의 코드가 포함되어 있습니다. disease_params는 strong_parameters gem을 사용하기위한 권장 사항에 따라 컨트롤러 하단에 정의됩니다.

감사합니다.

+0

조치 표시 – apneadiving

+0

어디에서 'disease_params'를 정의합니까? – apneadiving

+0

여기'params.require (: disease)'에서 실패하는 것 같지만 왜 그런지 말할 수 없습니다 – apneadiving

답변

3

질문 1 ("나는 Rspec이 게시물을 처리하는 방법을 어떻게보아야할지 모르겠다.) ..."사양 (예 : it 블록) 내에 "puts"문을 사용할 수 있습니다. . 예를 들어 다음과 같이 시도해 볼 수 있습니다.

describe "with invalid params" do 
    it "assigns a newly created but unsaved disease as @disease" do 
    # Trigger the behavior that occurs when invalid params are submitted 
    Disease.any_instance.stub(:save).and_return(false) 
    post :create, :disease => {} 
    puts :disease 
    assigns(:disease).should be_a_new(Disease) 
    end 
end 

중요한 디버깅 도구입니다. RSpec이 실행 중일 때 출력은 터미널의 .s 및 Fs에 있습니다.

질문 2의 경우, 당신이 무엇을 찾고 있는지 잘 모르겠지만 잘못된 질병이 @ 질병으로 지정되어 있는지 테스트해야한다는 것을 모릅니다. 필자는 컨트롤러 사양을 다음과 같은 스타일로 패턴 화하는 경향이 있습니다 (컨트롤러 사양 작성 방법을 배웠던 Everyday Rails Testing with RSpec에서 가져옴).

POST는 스펙 예제를 만들 :

context "with invalid attributes" do 
    it "does not save the new contact" do 
    expect{ 
     post :create, contact: Factory.attributes_for(:invalid_contact) 
    }.to_not change(Contact,:count) 
    end 

    it "re-renders the new method" do 
    post :create, contact: Factory.attributes_for(:invalid_contact) 
    response.should render_template :new 
    end 
end 
... 

당신은 더 철저하게 내가 모르는 컨트롤러 방법을 테스트하기위한 이유가있을 수 있습니다. 이 경우 질문 2에 대한 제 응답을 친절하게 무시하고 제 다른 대답이 유용 할 것입니다.

관련 문제