rspec 変数の読み込みタイミング

ケース1

コード

describe 'test1' do
  p "set value=1"
  value = 1
  it 'test1' do
    expect(value).to eq 1
  end
  describe 'test' do
    p "set value=2"
    value = 2
    it 'test2' do
      expect(value).to eq 2
    end
  end
end

結果

set valueが実行されてからテストが実施される。。。

"set value=1"
"set value=2"

test1
  test1 (FAILED - 1)
  test
    test2

Failures:

  1) test1 test1
     Failure/Error: expect(value).to eq 1

       expected: 1
            got: 2

       (compared using ==)
     # ./spec/test3_spec.rb:21:in `block (2 levels) in <top (required)>'

Finished in 0.02116 seconds (files took 3.42 seconds to load)
2 examples, 1 failure

修正1

beforeに入れてみる

コード

describe 'test1' do
  before do
    p "set value=1"
    value = 1
  end
  it 'test1' do
    expect(value).to eq 1
  end
  describe 'test' do
    before do
      p "set value=2"
      value = 2
    end
    it 'test2' do
      expect(value).to eq 2
    end
  end
end

結果

beforeで定義した変数をitの中で取得できないためエラーとなる。

修正2

@を使う。問題なく動くが、@を使うことは推奨されない

describe 'test1' do
  before do
    p "set value=1"
    @value = 1
  end
  it 'test1' do
    expect(@value).to eq 1
  end
  describe 'test' do
    before do
      p "set value=2"
      @value = 2
    end
    it 'test2' do
      expect(@value).to eq 2
    end
  end
end

結果

test1
"set value=1"
  test1
  test
"set value=1"
"set value=2"
    test2

修正3

it の中に入れる

describe 'test1' do
  it 'test1' do
    p "set value=1"
    value = 1
    expect(value).to eq 1
  end
  describe 'test' do
    it 'test2' do
      p "set value=2"
      value = 2
      expect(value).to eq 2
    end
  end
end

結果

問題なく動く

test1
"set value=1"
  test1
  test
"set value=2"
    test2

結論

describe直下(beforeの外)で、変数の定義は行わない
itの中か、letを使うようにする