コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RSpecのbeforeでパラメータ未指定した場合はbefore(:each) / before(:example)と同義

rspecのbeforeフックのところに説明がないのでメモ。

環境

$ bundle exec rspec -v
RSpec 3.8
  - rspec-core 3.8.0
  - rspec-expectations 3.8.2
  - rspec-mocks 3.8.0
  - rspec-rails 3.8.1
  - rspec-support 3.8.0

動き

未指定の場合は each と同じ挙動をする

検証

検証に使うspecファイル

spec/models/user_spec.rb として以下を用意する

# == Schema Information
#
# Table name: users
#
#  id         :bigint(8)        not null, primary key
#  name       :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

require 'rails_helper'

RSpec.describe User, type: :model do

  describe "#create" do
    let(:user) {User.create(name: nil)}

    # ココらへんを書き換える
    before do
      pp "throw before"
    end

    it "nameはnil" do
      expect(user.name).to eq(nil)
    end

    it "idは何か入っている" do
      expect(user.id).not_to eq(nil)
    end

  end

end

挙動の変化

何も指定指定しないパターン

before do
  pp "throw before"
end

itの度に実行

$ bundle exec rspec spec/models/user_spec.rb
"throw before"
."throw before"
.

Finished in 0.04923 seconds (files took 3.67 seconds to load)
2 examples, 0 failures

eachを指定するパターン

before(:each) do
  pp "throw before"
end

itの度に実行される

$ bundle exec rspec spec/models/user_spec.rb
"throw before"
."throw before"
.

Finished in 0.04535 seconds (files took 3.56 seconds to load)
2 examples, 0 failures

allを指定するパターン

before(:all) do
  pp "throw before"
end

1回だけ実行される

$ bundle exec rspec spec/models/user_spec.rb
"throw before"
..

Finished in 0.05138 seconds (files took 3.13 seconds to load)
2 examples, 0 failures

参考リンク