rspecで共通項があった場合、shared_examples_forでまとめることができます。

使い方

下記のようなmoduleがあったとします。

app/models/concerns/body_validators.rb

module BodyValidators
  extend ActiveSupport::Concern

  included do
    validates :body, presence: true,
                     length: { maximum: 200 }
  end
end

app/models/post.rb

class Post < ActiveRecord::Base
  include BodyValidators
end

app/models/comment.rb

class Comment < ActiveRecord::Base
  include BodyValidators
end

この二つは同じなので、共通して処理を行いたいです。

supportでshared_examples_forをincludeできるようにします。

spec/support/models/concerns/body_validators_spec.rb

require rails_helper

shared_examples_for body validation do
  describe body is do
    it not empty do
      body.body = nil
      expect(body).not_to be_valid
    end

    it maximum 200charcters do
      maximum_charcters = a * 500
      body.body = maximum_charcters
      expect(body).not_to be_valid
    end
  end
end

it_behaves_likeからは引数を渡せるので、引数を渡します。

spec/models/post.rb

require rails_helper

RSpec.describe Comment, type: :model do
  context validation do
    it_behaves_like body validation do
      let(:body) { build(:comment) }
    end
  end
end

これで共通の処理を行うことができます。

まとめ

shared_examples_forを使えば、テストのリファクタリングができます。

spec/models/comment.rb

require rails_helper

RSpec.describe Comment, type: :model do
  context validation do
    it_behaves_like body validation do
      let(:body) { build(:comment) }
    end
  end
end