2011-04-22 6 views
2

Rspec 2.0을 사용하고 있습니다. 범위가 어떻게 작동하는지 이해하지 못했습니다 ... 어떻게 든 블록의 변수를 읽을 수는 있지만 업데이트 할 수는 없습니까? 그게 왜?인스턴스 변수 및 Rspec 2.x와 관련된 문제

+0

오늘 밤 테스트를 통해 인스턴스, 클래스 및 전역 변수를 추적하는 방법을 자세히 설명합니다. http://brentlavelle.wordpress.com/2011/04/04/rspec-and-instance-variables/ –

답변

1

이것은 실제로 루비의 속성이며 RSpec 자체는 아닙니다. before 블록은 각 블록이 실행되기 전에 호출되는 콜백입니다. 변수가 blah으로 인스턴스화되는 방식입니다. 두 번째 테스트에서 before 블록이 다음 테스트를 위해 다시 호출 될 때 정의가 재정의되도록 정의했습니다. the RSpec book에 따르면

+0

그럼 어떻게 재사용하니? before (all)이므로 그 설명에서 실제로 한 번만 호출되어야합니다 ... 각 전에 not – Manu

+0

@@ test fixes를 사용하는 것 같습니다. – Manu

2

, before(:all) :

는 ... 객체의 그 자신의 인스턴스에서 한 번만 실행됩니다,하지만 인스턴스 변수는 예 을하는 각 인스턴스에 복사됩니다 운영. 일반적으로 을 사용하는 데주의해야 할 단어가 있으므로 예제를 각각 에서 완전히 분리하여 실행하고 싶습니다. 예를 통해 상태를 공유하는 즉시 예상치 못한 일이 발생하기 시작합니다.

예에서 각 테스트가 실행되기 전에 @blah이 복사되므로 할당 된 값이 예제에서 다른 것으로 옮겨지지 않습니다. 이 (에어 코드) 같은 것을하고 싶지처럼

보인다 :

it "gets a token" do 
    @token = OAuth.some_method_that_returns_a_token 
end 

it "uses that token to access some OAuth feature" do 
    result = OAuth.some_feature(@token) 
    result.should be_something_something 
end 

이 아닌 코드로, OAuth를의 테스트와 같은 냄새가 난다. 당신은 some_feature 방법 (더 많은 공기 코드) 밖으로 스텁 고려해야합니다

it "responds in some way when I use a valid token" do 
    @token = mock('token') 
    OAuth.should_receive(:some_feature).with(@token).and_return("success") 
    result = my_code_which_uses_ouath(@token) 
    result.should == "success" 
end 
0

저도 같은 문제로 실행을 내가 값을 변경하는 해시와 그것을 해결 : 이동이 문서 발견

describe "carry over value" do 
    let (:global) { Hash.new } 

    before :all do 
    global[:var1] = "foo" 
    end 

    it "should be foo" do 
    global[:var1].should == "foo" 
    end 

    it "set to bar" do 
    global[:var1] = "bar" 
    global[:var1].should == "bar" 
    end 

    it "should still be bar" do 
    global[:var1].should == "bar" 
    end 
end