diff --git a/Gemfile b/Gemfile
index 2be699a5afabd42d50d0d45d7ccbde7083ee9925..5fcd14e76e2f861bfdc9572da0501edde487276c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -354,7 +354,7 @@ group :development, :test do
 
   gem 'database_cleaner', '~> 1.7.0'
   gem 'factory_bot_rails', '~> 4.8.2'
-  gem 'rspec-rails', '~> 3.7.0'
+  gem 'rspec-rails', '~> 3.8.0'
   gem 'rspec-retry', '~> 0.6.1'
   gem 'rspec_profiling', '~> 0.0.5'
   gem 'rspec-set', '~> 0.1.3'
diff --git a/Gemfile.lock b/Gemfile.lock
index fe86437ce9937ce9a631b61891e18b751c88eede..725e47cc825b9b4a51f7c22b706b29dd2df6f754 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -814,36 +814,36 @@ GEM
       chunky_png
     rqrcode-rails3 (0.1.7)
       rqrcode (>= 0.4.2)
-    rspec (3.7.0)
-      rspec-core (~> 3.7.0)
-      rspec-expectations (~> 3.7.0)
-      rspec-mocks (~> 3.7.0)
-    rspec-core (3.7.1)
-      rspec-support (~> 3.7.0)
-    rspec-expectations (3.7.0)
+    rspec (3.8.0)
+      rspec-core (~> 3.8.0)
+      rspec-expectations (~> 3.8.0)
+      rspec-mocks (~> 3.8.0)
+    rspec-core (3.8.2)
+      rspec-support (~> 3.8.0)
+    rspec-expectations (3.8.4)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.7.0)
-    rspec-mocks (3.7.0)
+      rspec-support (~> 3.8.0)
+    rspec-mocks (3.8.1)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.7.0)
+      rspec-support (~> 3.8.0)
     rspec-parameterized (0.4.2)
       binding_ninja (>= 0.2.3)
       parser
       proc_to_ast
       rspec (>= 2.13, < 4)
       unparser
-    rspec-rails (3.7.2)
+    rspec-rails (3.8.2)
       actionpack (>= 3.0)
       activesupport (>= 3.0)
       railties (>= 3.0)
-      rspec-core (~> 3.7.0)
-      rspec-expectations (~> 3.7.0)
-      rspec-mocks (~> 3.7.0)
-      rspec-support (~> 3.7.0)
+      rspec-core (~> 3.8.0)
+      rspec-expectations (~> 3.8.0)
+      rspec-mocks (~> 3.8.0)
+      rspec-support (~> 3.8.0)
     rspec-retry (0.6.1)
       rspec-core (> 3.3)
     rspec-set (0.1.3)
-    rspec-support (3.7.1)
+    rspec-support (3.8.2)
     rspec_junit_formatter (0.4.1)
       rspec-core (>= 2, < 4, != 2.12.0)
     rspec_profiling (0.0.5)
@@ -1254,7 +1254,7 @@ DEPENDENCIES
   rouge (~> 3.5)
   rqrcode-rails3 (~> 0.1.7)
   rspec-parameterized
-  rspec-rails (~> 3.7.0)
+  rspec-rails (~> 3.8.0)
   rspec-retry (~> 0.6.1)
   rspec-set (~> 0.1.3)
   rspec_junit_formatter
diff --git a/ee/spec/services/ee/notes/quick_actions_service_spec.rb b/ee/spec/services/ee/notes/quick_actions_service_spec.rb
index 37cafe9f05b3953e61764c9f1a83a0643e5fd641..4b2cf92766e512bce76490450bc9c9482bea7a4e 100644
--- a/ee/spec/services/ee/notes/quick_actions_service_spec.rb
+++ b/ee/spec/services/ee/notes/quick_actions_service_spec.rb
@@ -179,7 +179,7 @@ def execute(note)
 
       context 'when epics are not enabled' do
         it 'does not add a label to the epic' do
-          expect { execute(note) }.not_to change { epic.reload.labels }
+          expect { execute(note) }.not_to change(epic.labels, :count)
         end
       end
 
@@ -212,7 +212,7 @@ def execute(note)
 
       context 'when epics are not enabled' do
         it 'does not remove any label' do
-          expect { execute(note) }.not_to change { epic.reload.labels }
+          expect { execute(note) }.not_to change(epic.labels, :count)
         end
       end
 
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 3d967aa4ab8799204cfb25946043944fc242d7eb..12dff440ce270c6063f2fadc9a3c17d3b6055b3e 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -2426,16 +2426,15 @@ def create_remote_branch(remote_name, branch_name, target)
       # Gets the commit oid, and warms the cache
       oid = project.commit.id
 
-      expect(Gitlab::Git::Commit).not_to receive(:find).once
+      expect(Gitlab::Git::Commit).to receive(:find).once
 
-      project.commit_by(oid: oid)
+      2.times { project.commit_by(oid: oid) }
     end
 
     it 'caches nil values' do
       expect(Gitlab::Git::Commit).to receive(:find).once
 
-      project.commit_by(oid: '1' * 40)
-      project.commit_by(oid: '1' * 40)
+      2.times { project.commit_by(oid: '1' * 40) }
     end
   end
 
diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb
index 3d2d4b5f2165d8c1dc5be3983272d013cc487366..b0bcd7a36bab695a174596d919300fb28128d645 100644
--- a/spec/services/issuable/bulk_update_service_spec.rb
+++ b/spec/services/issuable/bulk_update_service_spec.rb
@@ -165,7 +165,7 @@ def bulk_update(issuables, extra_params = {})
       context 'when the new assignee ID is not present' do
         it 'does not unassign' do
           expect { bulk_update(issue, assignee_ids: []) }
-            .not_to change { issue.reload.assignees }
+            .not_to change(issue.assignees, :count)
         end
       end
     end
diff --git a/spec/services/merge_requests/mergeability_check_service_spec.rb b/spec/services/merge_requests/mergeability_check_service_spec.rb
index 6efece640923e32f1fb9ae1f89dcee4b8181d8c0..6e827f2ea5bf475b7ad501f789d8a73c86025d77 100644
--- a/spec/services/merge_requests/mergeability_check_service_spec.rb
+++ b/spec/services/merge_requests/mergeability_check_service_spec.rb
@@ -11,7 +11,11 @@
     end
 
     it 'does not change the merge ref HEAD' do
-      expect { subject }.not_to change(merge_request, :merge_ref_head)
+      merge_ref_head = merge_request.merge_ref_head
+
+      subject
+
+      expect(merge_request.reload.merge_ref_head).to eq merge_ref_head
     end
 
     it 'returns ServiceResponse.error' do
@@ -73,7 +77,7 @@
 
       it 'second call does not change the merge-ref' do
         expect { subject }.to change(merge_request, :merge_ref_head).from(nil)
-        expect { subject }.not_to change(merge_request, :merge_ref_head)
+        expect { subject }.not_to change(merge_request.merge_ref_head, :id)
       end
     end
 
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index f566d235787c9d49a2dc66fb6f93df0e383b882c..7e5837a4798d24393a97f3d2f069b0be9ee26513 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -598,7 +598,7 @@ def update_merge_request(opts)
             feature_visibility_attr = :"#{merge_request.model_name.plural}_access_level"
             project.project_feature.update_attribute(feature_visibility_attr, ProjectFeature::PRIVATE)
 
-            expect { update_merge_request(assignee_ids: [assignee]) }.not_to change { merge_request.reload.assignees }
+            expect { update_merge_request(assignee_ids: [assignee]) }.not_to change(merge_request.assignees, :count)
           end
         end
       end