diff --git a/ee/spec/factories/epics.rb b/ee/spec/factories/epics.rb
index da479dafc1adfcca40aa476c40b494d832b313e2..dace8e0c0ee9fd9acc2469d4e807494a1b00a48d 100644
--- a/ee/spec/factories/epics.rb
+++ b/ee/spec/factories/epics.rb
@@ -37,5 +37,27 @@
         epic.update!(labels: evaluator.labels)
       end
     end
+
+    trait :with_synced_work_item do
+      work_item do
+        association(:work_item,
+          :epic,
+          namespace: group,
+          title: title,
+          description: description,
+          created_at: created_at,
+          updated_at: updated_at,
+          author: author,
+          iid: iid,
+          updated_by: updated_by,
+          state: state,
+          confidential: confidential
+        )
+      end
+
+      after(:create) do |epic, _|
+        epic.work_item.update!(iid: epic.iid, created_at: epic.created_at)
+      end
+    end
   end
 end
diff --git a/ee/spec/services/epics/close_service_spec.rb b/ee/spec/services/epics/close_service_spec.rb
index bcb78322ebc3627609cdc4ddb5063550fe559f8b..45f3a16128010c51312f69c2439340d3da027832 100644
--- a/ee/spec/services/epics/close_service_spec.rb
+++ b/ee/spec/services/epics/close_service_spec.rb
@@ -43,16 +43,8 @@
           end
 
           context 'with a synced work item' do
-            let_it_be(:work_item, reload: true) do
-              create(:work_item, :epic, namespace: group,
-                title: epic.title, description: epic.description, created_at: epic.created_at,
-                updated_at: epic.updated_at, author: epic.author, iid: epic.iid, updated_by: epic.updated_by
-              )
-            end
-
-            before do
-              epic.update!(issue_id: work_item.id)
-            end
+            let_it_be(:epic) { create(:epic, :with_synced_work_item, group: group) }
+            let(:work_item) { epic.work_item }
 
             subject { described_class.new(group: group, current_user: user).execute(epic) }
 
diff --git a/ee/spec/services/epics/reopen_service_spec.rb b/ee/spec/services/epics/reopen_service_spec.rb
index 6c2540370e0539e9e91b1b18a3013ce70093c725..f748f8282a3a48411828fe494595a12747dfda2e 100644
--- a/ee/spec/services/epics/reopen_service_spec.rb
+++ b/ee/spec/services/epics/reopen_service_spec.rb
@@ -71,16 +71,8 @@
           end
 
           context 'with a synced work item' do
-            let_it_be(:work_item, reload: true) do
-              create(:work_item, :epic, namespace: group, title: epic.title, description: epic.description,
-                created_at: epic.created_at, updated_at: epic.updated_at, author: epic.author, iid: epic.iid,
-                updated_by: epic.updated_by, state: :closed
-              )
-            end
-
-            before do
-              epic.update!(issue_id: work_item.id)
-            end
+            let_it_be(:epic) { create(:epic, :with_synced_work_item, group: group, state: :closed) }
+            let(:work_item) { epic.work_item }
 
             subject { described_class.new(group: group, current_user: user).execute(epic) }
 
diff --git a/ee/spec/services/epics/update_service_spec.rb b/ee/spec/services/epics/update_service_spec.rb
index a4d7a0a22a224f9981b7e89c5dcfc181f91debae..947fb295466043c768ab894b777026f5134086d2 100644
--- a/ee/spec/services/epics/update_service_spec.rb
+++ b/ee/spec/services/epics/update_service_spec.rb
@@ -756,16 +756,11 @@ def update_issuable(update_params)
 
     context 'work item sync' do
       let_it_be(:group) { create(:group) }
-      let_it_be_with_reload(:epic) { create(:epic, group: group) }
       let_it_be(:labels) { create_pair(:group_label, group: group) }
-      let_it_be(:work_item) do
-        create(:work_item, :epic, namespace: group, iid: epic.iid, author: epic.author, created_at: epic.created_at)
-      end
 
       context 'when epic has a synced work item' do
-        before do
-          epic.update!(issue_id: work_item.id)
-        end
+        let_it_be_with_reload(:epic) { create(:epic, :with_synced_work_item, group: group) }
+        let(:work_item) { epic.work_item }
 
         context 'multiple values update' do
           let_it_be(:synced_parent_work_item) { create(:work_item, :epic, namespace: group) }
@@ -829,6 +824,8 @@ def update_issuable(update_params)
       end
 
       context 'when epic has no synced work item' do
+        let_it_be_with_reload(:epic) { create(:epic, group: group) }
+
         it 'does not call WorkItems::UpdateService' do
           expect(WorkItems::UpdateService).not_to receive(:new)