同じような前提条件と検証内容で冗長になって来たので、リファクタリングとして共通化しました。
contextに記載した内容を実現する実装部分(前提条件)は、include_contextで呼び出して、shared_contextで受け、itの部分(検証内容)は、it_behaves_likeで呼び出して、shared_examples_forで受ければ共通化できて幸せ(可読性アップ)になれる。

リファクタリング

例えば、view specでログイン有無とサブドメインか否かで前提条件が別れる場合、それぞれをshared_contextで定義して、include_contextで呼び出してあげる。
また、サブドメインの検証内容をshared_examples_for(複数検証できる)で定義して、it_behaves_likeで呼び出してあげる。
すると、ログイン状態やサブドメインのデータ作成、サブドメインの検証内容を複数回書かなくてよくなる。

 require 'rails_helper'
 
 RSpec.describe 'layouts/application', type: :view do
   let!(:user) { FactoryBot.create(:user) }
+  shared_context 'login' do
+    before { login_user user }
+  end
+
+  shared_context 'subdomain' do
+    before do
+      @use_space = FactoryBot.create(:space)
+    end
+    # こっちの方がシンプルですね。
+    before { @use_space = FactoryBot.create(:space) }
+  end

<省略>

+  shared_examples_for 'サブドメイン' do
+    it 'スペース名が含まれる' do
+      render
+      expect(rendered).to match(Regexp.escape(@use_space.name))
+      # こっちの方がシンプルですね。
+      expect(rendered).to include(@use_space.name)
+    end
+    it 'スペース編集のパスが含まれる' do
+      render
+      expect(rendered).to match("\"#{Regexp.escape(edit_space_path(@use_space))}\"")
+      expect(rendered).to include("\"#{edit_space_path(@use_space)}\"")
+    end
+  end

-   context '未ログイン、サブドメイン' do
+   context '未ログイン' do
+    include_context 'subdomain'
-    before do
-      @use_space = FactoryBot.create(:space)
-    end
+    it_behaves_like 'サブドメイン'
-    it 'スペース名が含まれる' do
-      render
-      expect(rendered).to match(Regexp.escape(@use_space.name))
-    end
-    it 'スペース編集のパスが含まれる' do
-      render
-      expect(rendered).to match("\"#{Regexp.escape(edit_space_path(@use_space))}\"")
-    end
   end
 
-   context 'ログイン中、サブドメイン' do
+   context 'ログイン中' do
+    include_context 'login'
+    include_context 'subdomain'
-    before do
-      login_user user
-      @use_space = FactoryBot.create(:space)
-    end
+    it_behaves_like 'サブドメイン'
-    it 'スペース名が含まれる' do
-      render
-      expect(rendered).to match(Regexp.escape(@use_space.name))
-    end
-    it 'スペース編集のパスが含まれる' do
-      render
-      expect(rendered).to match("\"#{Regexp.escape(edit_space_path(@use_space))}\"")
-    end
   end
 end

shared_examples_for(←it_behaves_like)は、rspecでエラーになった時に出力されるので、contextの内容から外した方がきれい。

【参考】ここまでのコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/64ac977ab7c658e39a805bb5aba1cc92ec40d33a

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です