2014-12-12 2 views
2

전역 변수를 사용하지 않고 rspec에서 여러 컨텍스트간에 변수를 전달하는 가장 좋은 방법은 무엇이 있을까요? 새로운 컨텍스트, myVar에 변수가 다시 = 0 내가 필요하다 초기 상태에있을 것입니다 때문에여러 문맥 사이에서 변수를 전달하는 rspec 방법

이제
describe "My test" do 
    let(:myvar) { @myvar = 0 } 

    context "First test pass" do 
     it "passes" do 
      myvar = 20 
      expect(myvar).to eq(20) 
     end 
    end 

    context "Second test pass" do 
     it "passes" do 
      expect(myvar).to eq(20) 
     end 
    end 
end 

은, 분명히,이하자 작동하지 않습니다 :

예를 들어,이이 두 컨텍스트 사이에 "myvar = 20"의 값을 부여하는 두 컨텍스트 사이의 "캐시 상태"메커니즘

의견, 제안 및 개선을 환영합니다. 감사합니다.

+0

를 들어

더 낫다. 컨텍스트가 필요한 경우 컨텍스트 블록에서 컨텍스트를 만듭니다. – shirakia

답변

1
  1. 어떻게 될지 생각하지 않는 일이 발생합니다.
  2. 어떻게하면 좋을까요? "단위 테스트"를 방법으로 중단하십시오. 너무 많은 ... 함께 실행하면 따로 따로 실행할 때 그들이 일을해야한다는 것을 의미 분리에 일을, 어떤 순서로 할 수 있어야한다 단위 테스트 테스트 케이스 -

날 # 2를 먼저 설명하게 그래서 병렬에서 테스트 케이스를 실행 (기본 에서 같은) 일부 단위 테스트 프레임 워크 ... # 1에 관해서는

- 당신이 let(:myvar) { @myvar = 0 }에 값을 할당하지 않는 myvar = 20을 쓸 때, 당신은 단순히를 만들 로컬 변수는에 대한 모든 호출을 무시합니다.3210 메서드 내에서 사용할 수 있지만 외부 메서드 (myvar0을 반환합니다). 당신이 설정했을 경우에도

@myvar = 20 (처음 myvar 전화 하기 전에 당신이 그것을하지 않는 한)이 let 함수는 유품 패턴을 사용하기 때문에 대신, myvar 여전히 그것을 의미, 0을 반환 한 번만 호출하고, 후속 호출 (이 경우 0에서) 값이 원래 반환 반환됩니다 : 난 그냥이 같은 문제로 실행

puts myvar 
@myvar = 20 
puts myvar 

# => 0 
# => 0 
+0

간단히 말해서, 후속 컨텍스트를 통해 사용할 수 있지만 변경되지 않은 시작 상태 (객체 유형이든 간단한 유형이든)를 정의 할 수 있습니까? –

+1

@BakirJusufbegovic - 아니요, 각 테스트 케이스에 대해 다시 작성되었지만 테스트 케이스 내에 두 번 이상 다시 작성되지 않았습니다. –

+0

이는 let이 예제간에 재 작성된다는 것을 의미하지만 동일한 예제 내에서 사용되지는 않습니다 (여러 타임스). 추측하자면 필요한 메커니즘에 사용할 수 없으며 예제 간 변수의 "캐시 상태"기능입니다. 나는 단위 테스트가 그런 식으로 작동해서는 안된다는 것을 이해한다. (테스트는 독립적이어야한다.)하지만이 예제들이 테스트 순서라고 부르는 기능 테스트를 위해 RSpec을 사용하고있다. 다음 입력에 필요하다. –

0

. 내가 해결 한 방법은 factory_girl gem을 사용하는 것이었다. 당신이 공장을 만든 후이 같이 보이는 모델 할 필요가 이제

require 'factory_girl' 
require 'faker' # you can use faker, if you want to use the factory to generate fake data 

FactoryGirl.define do 
    factory :generate_data, class: MyModule::MyClass do 
    key 100 # doesn't matter what you put here, it's just a placeholder for now 
    another_key 'value pair' 
    end 
end 

:

Module MyModule 
    class MyClass 
    #for every key you create in your factory you must have a corresponding attribute accessor in the model. 
    attr_accessor :key, :another_key 

    #you can also place methods here to call from your spec test, if you wish 
    # def self.test 
     #some test 
    # end 
    end 
end 

이제 돌아갈를

이 공장을 만들 : 여기

은 기본이다 예를 들어 다음과 같이 할 수 있습니다.

describe "My test" do 
    let(:myvar) { @myvar } 

    context "First test pass" do 
     it "passes" do 
      @myvar.key = 20 #when you do this you set it now from 100 to 20 
      expect(@myvar.key).to eq(20) 
     end 
    end 

    context "Second test pass" do 
     it "passes" do 
      expect(@myvar.key).to eq(20) #it should still be 20 unless you overwrite that variable 
     end 
    end 
end 

다른 사람들이 말했듯이, 단위 테스트의 적절한 방법이 아닙니다. 하지만, 당신이 단위 테스트를하고 있는지 여부를 어떻게 알 수 있습니까? 그래서, 나는 판단하지 않을 것이다. 어쨌든 행운을 빌어 다른 해결책이 있다면 알려주세요!

4

또 다른 간단한 방법은 설명 컨텍스트에서 '로컬 변수'를 정의하는 것입니다. '로컬 변수'는 설명 전반에 걸쳐 나타나며 런타임 중 변경 사항이 적용되면 변경됩니다. 간단히 상황 사이에 변수를 전달하지 예를

describe 'tests' do 
    context 'Sharing a variable across tests' do 
     var = 1 
     puts var 

     it "it one. var = #{var}" do 
      var = var*2 
      puts var 
     end 
     it "it two" do 
      puts var 
     end 
    end 
end 

출력

1 
2 
1 
관련 문제