Category Archives: rspec

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

コード

require 'rails_helper'
describe 'test' do
  let(:my_id) { DateTime.now.strftime("%H%m%s").to_i.to_s }
  before do
    p my_id
    sleep 5
  end
  describe 'test1' do
    it 'test' do
      p my_id
      expect(1).to eq 1
    end
  end
  describe 'test2' do
    it 'test' do
      p my_id
      expect(1).to eq 1
    end
  end
end

結果

各beforeのタイミングでsetされて同じ値がitの中で仕様される

test
  test1
"15031488521670"
"15031488521670"
    test
  test2
"15031488521675"
"15031488521675"
    test

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を使うようにする

rspec model callback

model

class User < ApplicationRecord
  before_save :set_name
  def set_name
    self.name = "set"
  end
end

rspec

require 'rails_helper'

describe 'test' do
  let(:user) { User.create }
  describe 'test' do
    before do
      user.name = "yohei"
      user.save // user.nameが"set"に更新される
    end
    it 'check name' do
      expect(user.name).to eq 'yohei' // このテストは通らない
    end
  end
end

spec結果

  1) test test check name
     Failure/Error: expect(user.name).to eq 'yohei'

       expected: "yohei"
            got: "set"

       (compared using ==)

rspec letのobject_id

テストコード

require 'rails_helper'

describe 'test' do
  let(:hash){{}}
  describe 'test1' do
    before do
      p hash.object_id
    end
    it 'test' do
      p hash.object_id
      expect(1).to eq 1
    end
  end
  describe 'test2' do
    before do
      p hash.object_id
    end
    it 'test' do
      p hash.object_id
      expect(1).to eq 1
    end
  end
end

結果

各beforeとitは、同じobject_id。
describeごとにobject_idは異なる。

test
  test1
70254598086000
70254598086000
    test
  test2
70254598063460
70254598063460
    test

rspec letをbefore内で呼び出す

テストコード

以下のように、before内でもletはよびだせる

require 'rails_helper'

describe 'test' do
  let (:user) { User.new }
  before do
    user.name = "hello"
  end
  it 'test' do
    expect(user.name).to eq "hello"
  end
end

rspec letとbefore呼び出されるタイミング

テストコード

require 'rails_helper'

describe 'test' do
  before do
    p "before!"
  end

  let(:user) {
    p "let!"
    user = User.create(name: "hello")
  }

  let(:user2) {
    p "let!"
    user = User.create(name: "hello2")
  }

  it 'test1' do
    expect(user.name).to eq "hello"
  end

  it 'test2' do
    p user.name
    expect(User.all.count).to eq 1
  end
end

結果

beforeの次にletが呼び出される。

test
"before!"
"let!"
  test1
"before!"
"let!"
"hello"
  test2

rspec hash include

以下の方法で含んでいるかの確認ができる

require 'rails_helper'

describe 'test' do
  it 'test' do
    hash_correct = {:name=>"hello"}
    expect({:name=>"hello", :age=>35}).to include hash_correct
  end
end