2013-08-19 2 views
0

rspec에서이 코드를 테스트하는 데 문제가 있습니다. 테스트에서 제공하는 오류를 기반으로 테스트가 올바르게 (거의 또는 전혀) 작성되지 않았 음을 예상합니다. 올바른, 그것은 단지 어떤 이유로 그것을 얻지 못하고있다. 나는 또한 코드가 브라우저에서 작동 함을 주목해야한다.작성 작업이 완료된 후 rspec 컨트롤러 테스트

편집 : 사과가 명확하지 않은 경우 이 컨트롤러 (evaluations_controller)에서 사용자는 주어진 그룹의 각 학생을 반복하고 일련의 목표에 따라 진행 상황을 평가합니다. 새 작업에서 @student = groups.student.first - 해당 학생의 평가 데이터가 작성 작업에 성공적으로 저장되면 student_id가 1 씩 증가하고 새 student_id가 새 작업으로 다시 전달되므로 (다음 학생을 평가할 수 있음) -이 더 이상 학생이 없을 때까지 반복합니다.

내가 테스트하려는 것은 student_id가 평가가 생성 작업에 저장되면 성공적으로 증가하고 있다는 것입니다.

코드 :

def create 
... 
    if @evaluation.save 
    @id = params[:student_id] 
    @id = @id.to_i + 1 
    redirect_to evaluate_path({ student_group_id: @student_group, student_id: @id}) 
    else 
    ... 
    end 
end 

RSpec에 시험 :

it "should load the next student" do 
    #set @id to current student.id +1 
    @id = @student.id 
    @id = @id.to_i + 1 
    #post :create 
    post :create, {student_group_id: @student_group, student_id: @student, evaluation: @attr} 
    controller.params[:student_id].should eql @id     
end 

오류 :

Failure/Error: controller.params[:student_id].should eql @id expected: 2 got: "1"

+0

당신은 매개 변수를 결코 업데이트하지 않습니다. 테스트에서 꽤 명확한 것 같습니다. – apneadiving

+0

? 미안하지만 어떻게 할 수 있니? – dax

+0

당신의 주장에서 당신이 테스트하려고하는 것이 확실하지 않습니다. 'evaluate_path'에 전달 된 'student_id'가 생성 액션에 전달 된 ID보다 하나 더 크다는 것을 주장하고 싶습니까? – gregates

답변

1

귀하의 코드가 결함이있는 것으로 보인다, 그 결과 테스트가 명확하지 않다.

코드를 수집 할 때 다음/이전 학생 기능의 일부 유형을 사용하고 싶습니다. 이를 달성하기 위해 컨트롤러 테스트를 해킹하고있는 것으로 보입니다.

if @evaluation.save 
    @id = params[:student_id] 
    @id = @id.to_i + 1 

수동으로 다음 ID를 계산하고 있습니다. 자문 해보십시오 : student.id 1으로 작업하고이 계산을 실행하지만 student.id 2이 삭제되면 어떻게됩니까?

ActiveRecord 오류가 발생합니다.

다음 학생을 당기는 좋은 방법이 필요합니다. 당신은 당신을 위해 처리하기 위해 학생 모델 인스턴스 메서드를 추가해야합니다 :

def next 
    Student.where(id: id).order("id ASC").first 
    end 

를 컨트롤러에서 사용하면 다음과 같은 다음 학생에게 이동할 수 있습니다

redirect_to evaluate_path({ student_group_id: @student_group, student_id: @student.next.id}) 

그런 다음 테스트가 훨씬 더 간단해야한다 .

+0

정말 감사합니다. 훨씬 쉽습니다. 그러나 현재로서는 작동하지 않습니다.:/그냥'nil'을 반환합니다. '$ first_student.next' ==> '학생로드 (0.4ms) SELECT "students". * FROM "students"WHERE "students". "id"= 0 ORDER BY id ASC LIMIT 1' '=> nil' – dax

+0

사실 나는 def 메소드에서 오타를 만들었다 고 생각합니다. 그러나 이제는 그것을 고쳤으며 똑 같은 student_id (1)를 반환했습니다. – dax

+0

- http : //stackoverflow.com/a/7394804/2128691 당신은 여전히 ​​올바른 방향으로 나를 지적했다, 고마워! – dax

관련 문제