diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb
index 4f01839fec418a42e3cbb09905e2f8ab3b88dbd1..00b8ca0a4ff319fd427d98227fb69bc03c71005c 100644
--- a/spec/controllers/dashboard/todos_controller_spec.rb
+++ b/spec/controllers/dashboard/todos_controller_spec.rb
@@ -4,7 +4,7 @@
 
 RSpec.describe Dashboard::TodosController do
   let_it_be(:user) { create(:user) }
-  let_it_be(:project) { create(:project).tap { |project| project.add_developer(user) } }
+  let_it_be(:project) { create(:project, developers: user) }
   let_it_be(:author) { create(:user) }
 
   before do
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
index 82087ec1247b4a35ecf1933f698986667cbcad7e..c203effff17090107d2614659b418e1977994bf4 100644
--- a/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -17,7 +17,7 @@
     let_it_be(:project) { create(:project, :repository) }
     let_it_be(:user) { create(:user) }
 
-    let_it_be(:accessible_project) { create(:project, :internal).tap { |p| p.add_developer(user) } }
+    let_it_be(:accessible_project) { create(:project, :internal, developers: user) }
     let_it_be(:inaccessible_project) { create(:project, :internal) }
     let_it_be(:project_private) { create(:project, :private) }
 
diff --git a/spec/features/nav/new_nav_invite_members_spec.rb b/spec/features/nav/new_nav_invite_members_spec.rb
index 5a75025c98ba77e4c15298914b463228ac21ad59..6e81b3a432299c919571f5f0dad74f3198e935d4 100644
--- a/spec/features/nav/new_nav_invite_members_spec.rb
+++ b/spec/features/nav/new_nav_invite_members_spec.rb
@@ -28,7 +28,7 @@
   end
 
   context 'when inside a project' do
-    let_it_be(:project) { create(:project, :repository).tap { |record| record.add_owner(user) } }
+    let_it_be(:project) { create(:project, :repository, owners: user) }
 
     before do
       visit project_path(project)
diff --git a/spec/finders/ci/runner_jobs_finder_spec.rb b/spec/finders/ci/runner_jobs_finder_spec.rb
index 66cdde756be7aac2294fcf002cacc23dc21f4f16..2f1611910a59425101c800e701a5e97033c2ef40 100644
--- a/spec/finders/ci/runner_jobs_finder_spec.rb
+++ b/spec/finders/ci/runner_jobs_finder_spec.rb
@@ -53,9 +53,9 @@
     end
 
     context 'when the user has different access levels in different projects' do
-      let_it_be(:guest_project) { create(:project).tap { |p| p.add_guest(user) } }
+      let_it_be(:guest_project) { create(:project, guests: user) }
       let_it_be(:guest_jobs) { create_list(:ci_build, 2, runner: runner, project: guest_project) }
-      let_it_be(:reporter_project) { create(:project).tap { |p| p.add_reporter(user) } }
+      let_it_be(:reporter_project) { create(:project, reporters: user) }
       let_it_be(:reporter_jobs) { create_list(:ci_build, 3, runner: runner, project: reporter_project) }
 
       it 'returns only the jobs the user has permission to see', :aggregate_failures do
diff --git a/spec/finders/deploy_keys/deploy_keys_finder_spec.rb b/spec/finders/deploy_keys/deploy_keys_finder_spec.rb
index f0d3935cc957e48f98f0cd6d1279ba18962b7150..ef4414428a9284cffc19ec22ea2abbffb02b0c5d 100644
--- a/spec/finders/deploy_keys/deploy_keys_finder_spec.rb
+++ b/spec/finders/deploy_keys/deploy_keys_finder_spec.rb
@@ -7,7 +7,7 @@
     let_it_be(:user) { create(:user) }
     let_it_be(:project) { create(:project, :repository) }
 
-    let_it_be(:accessible_project) { create(:project, :internal).tap { |p| p.add_developer(user) } }
+    let_it_be(:accessible_project) { create(:project, :internal, developers: user) }
     let_it_be(:inaccessible_project) { create(:project, :internal) }
     let_it_be(:project_private) { create(:project, :private) }
 
diff --git a/spec/graphql/mutations/work_items/linked_items/base_spec.rb b/spec/graphql/mutations/work_items/linked_items/base_spec.rb
index bc52aee443e4c6b1baf66657a0e3716bf87fdf52..58c43debce4e014a2c9073e5debb1265238d0efb 100644
--- a/spec/graphql/mutations/work_items/linked_items/base_spec.rb
+++ b/spec/graphql/mutations/work_items/linked_items/base_spec.rb
@@ -6,7 +6,7 @@
   include GraphqlHelpers
 
   let_it_be(:user) { create(:user) }
-  let_it_be(:project) { create(:project).tap { |group| group.add_maintainer(user) } }
+  let_it_be(:project) { create(:project, maintainers: user) }
   let_it_be(:work_item) { create(:work_item, project: project) }
 
   it 'raises a NotImplementedError error if the update_links method is called on the base class' do
diff --git a/spec/graphql/resolvers/users/participants_resolver_spec.rb b/spec/graphql/resolvers/users/participants_resolver_spec.rb
index ae23eabaeb01290db4a4f3875790b2ddd207a81e..cce0393a3400be6f4d0519614bebac9e962277a1 100644
--- a/spec/graphql/resolvers/users/participants_resolver_spec.rb
+++ b/spec/graphql/resolvers/users/participants_resolver_spec.rb
@@ -15,7 +15,7 @@
       end
     end
 
-    let_it_be(:private_project) { create(:project, :private).tap { |r| r.add_developer(user) } }
+    let_it_be(:private_project) { create(:project, :private, developers: user) }
 
     let_it_be(:issue) { create(:issue, project: project) }
     let_it_be(:private_issue) { create(:issue, project: private_project) }
diff --git a/spec/graphql/resolvers/work_item_resolver_spec.rb b/spec/graphql/resolvers/work_item_resolver_spec.rb
index dacc6ac11d8cd052e70705f849b1002a3ee9831b..78402b4208f28f3e48a4fba1d91a96225c8a5c66 100644
--- a/spec/graphql/resolvers/work_item_resolver_spec.rb
+++ b/spec/graphql/resolvers/work_item_resolver_spec.rb
@@ -7,7 +7,7 @@
 
   describe '#resolve' do
     let_it_be(:developer) { create(:user) }
-    let_it_be(:project) { create(:project, :private).tap { |project| project.add_developer(developer) } }
+    let_it_be(:project) { create(:project, :private, developers: developer) }
     let_it_be(:work_item) { create(:work_item, project: project) }
 
     let(:current_user) { developer }
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index f2e88bc311d7dda714f56651396cf524697dff03..cb6fcaa9d65064e77388257b8c48480abbf0d70a 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -101,7 +101,7 @@
   describe '#assigned_issuables_count', feature_category: :team_planning do
     context 'when issuable is issues' do
       let_it_be(:user) { create(:user) }
-      let_it_be(:project) { create(:project).tap { |p| p.add_developer(user) } }
+      let_it_be(:project) { create(:project, developers: user) }
 
       subject { helper.assigned_issuables_count(:issues) }
 
diff --git a/spec/models/preloaders/project_policy_preloader_spec.rb b/spec/models/preloaders/project_policy_preloader_spec.rb
index 79f232f5ce2ecc7fedb5132fda7fdc1645643215..a278194e9e103ff42c9fa1c648f7d40d20dee17f 100644
--- a/spec/models/preloaders/project_policy_preloader_spec.rb
+++ b/spec/models/preloaders/project_policy_preloader_spec.rb
@@ -33,11 +33,11 @@
     preload_projects_for_policy(user)
     control = ActiveRecord::QueryRecorder.new { authorize_all_projects(user) }
 
-    new_project1 = create(:project, :private).tap { |project| project.add_maintainer(user) }
+    new_project1 = create(:project, :private, maintainers: user)
     new_project2 = create(:project, :private, namespace: root_parent)
 
     another_root = create(:group, :private, name: 'root-3', path: 'root-3')
-    new_project3 = create(:project, :private, namespace: another_root).tap { |project| project.add_maintainer(user) }
+    new_project3 = create(:project, :private, namespace: another_root, maintainers: user)
 
     pristine_projects = Project.where(id: base_projects + [new_project1, new_project2, new_project3])
 
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 86cfb1c35cfdddf392eff0bba9631c32f99d1d5a..c7d6e7f89174fd8ba3ce21fc1e91e98144d4f200 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -4878,7 +4878,7 @@ def login_method(login)
 
     it 'includes projects that belong to a user, but no other projects' do
       owned = create(:project, :private, namespace: user.namespace)
-      member = create(:project, :private).tap { |p| p.add_maintainer(user) }
+      member = create(:project, :private, maintainers: user)
       other = create(:project)
 
       expect(subject).to include(owned)
diff --git a/spec/requests/api/graphql/issues_spec.rb b/spec/requests/api/graphql/issues_spec.rb
index 913f1fc6367fe8dbd2a1f78cc0ed2919eac403f0..b783926434c2a1273cf0df306a8bc49e3535d413 100644
--- a/spec/requests/api/graphql/issues_spec.rb
+++ b/spec/requests/api/graphql/issues_spec.rb
@@ -215,7 +215,7 @@ def pagination_query(params)
       control = ActiveRecord::QueryRecorder.new(skip_cached: false) { post_query }
       expect_graphql_errors_to_be_empty
 
-      new_private_project = create(:project, :private).tap { |project| project.add_developer(current_user) }
+      new_private_project = create(:project, :private, developers: current_user)
       create(:issue, project: new_private_project)
 
       private_group = create(:group, :private, developers: current_user)
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 2e6625679521239c0657d4aeeae09215b2e7b1f3..de71aaa72c6e80937b1e53bf99b6da525884ef94 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -73,7 +73,7 @@
       end
 
       describe 'authorization' do
-        let_it_be(:project) { create(:project, :private, group: group).tap { |project| project.add_guest(user) } }
+        let_it_be(:project) { create(:project, :private, group: group, guests: user) }
 
         let(:opts) { { title: 'private issue', description: 'please fix' } }
 
@@ -170,7 +170,7 @@
 
       context 'when issue template is provided' do
         let_it_be(:files) { { '.gitlab/issue_templates/Default.md' => 'Default template contents' } }
-        let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: files).tap { |project| project.add_guest(user) } }
+        let_it_be_with_reload(:project) { create(:project, :custom_repo, group: group, files: files, guests: user) }
 
         context 'when description is blank' do
           it 'sets template contents as description when description is blank' do
diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb
index 2ff2486dc50d5003e00f52491d6d2240bcfdd0a4..6a58733df30b376eabdc071dc21d629be5cc2f10 100644
--- a/spec/services/merge_requests/push_options_handler_service_spec.rb
+++ b/spec/services/merge_requests/push_options_handler_service_spec.rb
@@ -924,7 +924,7 @@ def run_service_with_exception
   end
 
   describe 'when MRs are not enabled' do
-    let(:project) { create(:project, :public, :repository).tap { |pr| pr.add_developer(user1) } }
+    let(:project) { create(:project, :public, :repository, developers: user1) }
     let(:push_options) { { create: true } }
     let(:changes) { new_branch_changes }
 
diff --git a/spec/services/notification_recipients/builder/default_spec.rb b/spec/services/notification_recipients/builder/default_spec.rb
index da991b5951a1579fbfad9d685d3bbd55967a42a9..fef9340141fb661c673286aa7702a0e7613d3b60 100644
--- a/spec/services/notification_recipients/builder/default_spec.rb
+++ b/spec/services/notification_recipients/builder/default_spec.rb
@@ -5,7 +5,7 @@
 RSpec.describe NotificationRecipients::Builder::Default, feature_category: :team_planning do
   describe '#build!' do
     let_it_be(:group)   { create(:group, :public) }
-    let_it_be(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) if project_watcher } }
+    let_it_be(:project) { create(:project, :public, group: group, developers: project_watcher) }
     let_it_be(:target)  { create(:issue, project: project) }
 
     let_it_be(:current_user)    { create(:user) }
@@ -135,7 +135,7 @@
           let(:grand_parent_group) { create(:group, :public) }
           let(:parent_group) { create(:group, :public, parent: grand_parent_group) }
           let(:group) { create(:group, :public, parent: parent_group) }
-          let(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) } }
+          let(:project) { create(:project, :public, group: group, developers: project_watcher) }
           let(:target) { create(:issue, project: project) }
 
           before do
diff --git a/spec/services/users/assigned_issues_count_service_spec.rb b/spec/services/users/assigned_issues_count_service_spec.rb
index 2062f68b24b8ed47a8400819281880507013000d..4d014c6441b102e44f6baada83da983898736799 100644
--- a/spec/services/users/assigned_issues_count_service_spec.rb
+++ b/spec/services/users/assigned_issues_count_service_spec.rb
@@ -30,7 +30,7 @@
 
   context 'when the number of assigned open issues exceeds max_limit' do
     let_it_be(:banned_user) { create(:user, :banned) }
-    let_it_be(:project) { create(:project).tap { |p| p.add_developer(user) } }
+    let_it_be(:project) { create(:project, developers: user) }
 
     context 'when user is admin', :enable_admin_mode do
       let_it_be(:admin) { create(:admin) }
diff --git a/spec/services/work_items/task_list_reference_replacement_service_spec.rb b/spec/services/work_items/task_list_reference_replacement_service_spec.rb
index 8f696109fa155d72af8f73d384a93c6a8ae374c4..c7765e7c8989c111d52ac4185dda500ad0b68d68 100644
--- a/spec/services/work_items/task_list_reference_replacement_service_spec.rb
+++ b/spec/services/work_items/task_list_reference_replacement_service_spec.rb
@@ -4,7 +4,7 @@
 
 RSpec.describe WorkItems::TaskListReferenceReplacementService, feature_category: :team_planning do
   let_it_be(:developer) { create(:user) }
-  let_it_be(:project) { create(:project, :repository).tap { |project| project.add_developer(developer) } }
+  let_it_be(:project) { create(:project, :repository, developers: developer) }
   let_it_be(:single_line_work_item, refind: true) { create(:work_item, project: project, description: '- [ ] single line', lock_version: 3) }
   let_it_be(:multiple_line_work_item, refind: true) { create(:work_item, project: project, description: "Any text\n\n* [ ] Item to be converted\n    second line\n    third line", lock_version: 3) }