2011-01-10 1 views
0

나는 실수로 '편집'메서드를 '작성'메서드 내에 정의한 레일즈 컨트롤러를 사용합니다. 오류가있는컨트롤러 오류에도 불구하고 편집 URL을 방문하는 동안 오류가 올바르게 표시되지만 테스트는 계속됩니다. 이게 왜 그렇게?

내 컨트롤러 :

class UsersController < ApplicationController 
... 
    def create 
    @user = User.new(params[:user]) 
    ... 

    def edit 
     @user = User.find(params[:id]) 
     @title = "Edit user" 
     @check = "BORK" # something I added for testing the rendered output 
    end 
    end 
end 

예 시험; 나는 시험 (내가 RSpec에 사용) 출력 response.body을 실행할 때

it "should have the right title" do 
    get :edit, :id => @user 
    response.should have_selector('title', :content => 'Edit user') 
end 

따라서, 사용자 edit.html.erb 템플릿이 제대로 렌더링; 모든 인스턴스 변수가 표시됩니다. 그래서 모든 검사가 끝납니다.

'edit'URL을 방문하면 오류가 올바르게 표시됩니다. 템플릿은 @user 인스턴스 변수를 사용하고 올바르게 설정되지 않았습니다. 물론 컨트롤러를 수정하면 오류가 수정됩니다.

왜 테스트가 통과하는지, 왜 테스트에서 모든 인스턴스 변수 값을 볼 수 있는지 이해할 수 없습니까?

본능은 이것이 범위 문제라고 제안합니까? @user가 인스턴스 변수 인 것과 테스트의 범위 내에서 테스트 범위 내에서 설정되었지만 내 컨트롤러에서는 내부 '편집'메서드의 범위 내에 있습니까? 그러나 테스트는 어떻게 '편집'방법을 찾는가? 내부 '편집'방법은 어떤 범위에 존재합니까?

+0

당신은 오류를 붙여 넣을 수 있습니다 ? – Pasta

답변

3

def 구조는 if 문과 같은 실행 코드이기 때문에 실현해야합니다. 레일 모든 (대부분)로 다시로드하기 때문에

>> class Foo 
>> def foo 
>>  def bar 
>>  end 
>> end 
>> end 
=> nil 
>> Foo.instance_methods(false) 
=> ["foo"] 
>> Foo.new.foo 
=> nil 
>> Foo.instance_methods(false) 
=> ["foo", "bar"] 

이유는이 브라우저에 erroring이었다 : 그것은 다른 방법 안에 넣어 무효을 아니지만, 그것은 외부 메서드가 호출 될 때까지 실행되지 않습니다 귀하의 클래스는 각 요청. 따라서 edit 메서드를 정의하는 동작 인 create 작업을 방문한 경우에도 다음 요청에서이 작업을 다시 언로드해야합니다.

그러나 테스트 환경에서 이전 테스트가 create 작업을 호출 한 경우 나중에 테스트 할 때 edit 작업을 정의했을 수 있습니다. 테스트가 다른 순서로 실행되면 다른 결과가 나타납니다 (자체에 의존하는 것이 좋지 않습니다).

일반적 물론이 함께 당신이 전혀 원하는, 최대 그것을 그래서 그냥 명확하고 이동하지 않습니다 :)

+0

이제 알겠습니다. 방금 Ruby에 관해 새로운 것을 가르쳐 줬어. 함수에 범위가있는 JavaScript와 같은 것을 기대하고있었습니다. –