diff --git a/ee/spec/models/merge_trains/train_spec.rb b/ee/spec/models/merge_trains/train_spec.rb
index 37a7aafabe4d9c6fe8fd309b39fcb4b59afc8fd7..148070b8f5a773feb91b5ae6eea3871fc4bfcbc7 100644
--- a/ee/spec/models/merge_trains/train_spec.rb
+++ b/ee/spec/models/merge_trains/train_spec.rb
@@ -1,74 +1,44 @@
 # frozen_string_literal: true
 
-require "spec_helper"
+require 'spec_helper'
 
 RSpec.describe MergeTrains::Train, feature_category: :merge_trains do
-  let_it_be(:project) { create(:project, :repository) }
+  let_it_be(:target_project) { create(:project, :repository) }
+  let_it_be(:merge_request) { create_merge_request_on_train }
 
-  let(:train) { described_class.new(target_project, target_branch) }
+  let(:train) { described_class.new(target_project, merge_request.target_branch) }
 
   describe '#all_cars' do
-    let(:target_project) { merge_request.target_project }
-    let(:target_branch)  { merge_request.target_branch }
-    let!(:merge_request) { create_merge_request_on_train }
-
     subject { train.all_cars }
 
     it 'returns the merge request car' do
       is_expected.to eq([merge_request.merge_train_car])
     end
 
-    context 'when the other merge request is on the merge train' do
-      let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome') }
-
-      it 'returns both cars in order of creation' do
-        is_expected.to eq([merge_request.merge_train_car, merge_request_2.merge_train_car])
+    context 'when another merge request is opened but not on merge train' do
+      let!(:other_merge_request) do
+        create(:merge_request,
+          source_project: target_project,
+          source_branch: 'improve/awesome',
+          target_branch: merge_request.target_branch)
       end
-    end
-
-    context 'when the merge request has already been merged' do
-      let!(:merge_request) { create_merge_request_on_train(status: :merged) }
 
-      it { is_expected.to be_empty }
+      it { is_expected.to eq([merge_request.merge_train_car]) }
     end
 
-    context 'when the merge request is not on merge train' do
-      let(:merge_request) { create(:merge_request) }
-
-      it { is_expected.to be_empty }
-    end
-  end
-
-  describe '#first_car' do
-    subject { train.first_car }
-
-    let(:target_project) { merge_request.target_project }
-    let(:target_branch) { merge_request.target_branch }
-    let!(:merge_request) { create_merge_request_on_train }
-
-    it 'returns the merge request' do
-      is_expected.to eq(merge_request.merge_train_car)
-    end
-
-    context 'when the other merge request is on the merge train' do
+    context 'with another open merge request on the merge train' do
       let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome') }
 
-      it 'returns the merge request' do
-        is_expected.to eq(merge_request.merge_train_car)
+      it 'returns both cars in order of creation' do
+        is_expected.to eq([merge_request.merge_train_car, merge_request_2.merge_train_car])
       end
     end
 
-    context 'when the merge request has already been merged' do
-      let!(:merge_request) { create_merge_request_on_train(status: :merged) }
+    context 'with another open merge request that has already been merged' do
+      let!(:merged_merge_request) { create_merge_request_on_train(status: :merged, source_branch: 'improve/awesome') }
 
-      it { is_expected.to be_nil }
-    end
-
-    context 'when the merge request is not on merge train' do
-      let(:merge_request) { create(:merge_request) }
-
-      it 'returns empty array' do
-        is_expected.to be_nil
+      it 'does not return the merged car' do
+        is_expected.to eq([merge_request.merge_train_car])
       end
     end
   end
@@ -76,38 +46,35 @@
   describe '#sha_exists_in_history?' do
     subject { train.sha_exists_in_history?(target_sha, limit: limit) }
 
-    let(:target_project) { project }
-    let(:target_branch) { 'master' }
     let(:target_sha) { '' }
     let(:limit) { 20 }
 
     context 'when there is a merge request on train' do
-      let!(:merge_request_1) { create_merge_request_on_train }
       let(:merge_commit_sha_1) { OpenSSL::Digest.hexdigest('SHA256', 'test-1') }
       let(:target_sha) { merge_commit_sha_1 }
 
       context 'when the merge request has already been merging' do
-        let!(:merge_request_1) { create_merge_request_on_train(status: :merging) }
+        let!(:merge_request) { create_merge_request_on_train(status: :merging, source_branch: 'improve/awesome') }
 
         before do
-          merge_request_1.update_column(:in_progress_merge_commit_sha, merge_commit_sha_1)
+          merge_request.update_column(:in_progress_merge_commit_sha, merge_commit_sha_1)
         end
 
         it { is_expected.to eq(true) }
       end
 
       context 'when the merge request has already been merged' do
-        let!(:merge_request_1) { create_merge_request_on_train(status: :merged) }
+        let!(:merge_request) { create_merge_request_on_train(status: :merged, source_branch: 'improve/awesome') }
 
         before do
-          merge_request_1.update_column(:merge_commit_sha, merge_commit_sha_1)
+          merge_request.update_column(:merge_commit_sha, merge_commit_sha_1)
         end
 
         it { is_expected.to eq(true) }
       end
 
       context 'when there is another merge request on train and it has been merged' do
-        let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome', status: :merged) }
+        let!(:merge_request_2) { create_merge_request_on_train(status: :merged, source_branch: 'improve/awesome') }
         let(:merge_commit_sha_2) { OpenSSL::Digest.hexdigest('SHA256', 'test-2') }
         let(:target_sha) { merge_commit_sha_2 }
 
@@ -135,51 +102,43 @@
     end
   end
 
-  describe '#car_count' do
-    subject { train.car_count }
-
-    let(:target_project) { merge_request.target_project }
-    let(:target_branch) { merge_request.target_branch }
-    let!(:merge_request) { create_merge_request_on_train }
+  describe '#first_car' do
+    subject { train.first_car }
 
-    it 'returns the merge request' do
-      is_expected.to eq(1)
-    end
+    let(:first) { instance_double(MergeTrains::Car) }
+    let(:last) { instance_double(MergeTrains::Car) }
 
-    context 'when the other merge request is on the merge train' do
-      let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome') }
+    let(:cars) { [first, last] }
 
-      it 'returns the merge request' do
-        is_expected.to eq(2)
+    it 'returns the first record of the all_cars relation' do
+      allow_next_instance_of(MergeTrains::Train) do |train|
+        allow(train).to receive(:all_cars).and_return(cars)
       end
-    end
-
-    context 'when the merge request has already been merged' do
-      let!(:merge_request) { create_merge_request_on_train(status: :merged) }
 
-      it 'returns zero' do
-        is_expected.to be(0)
-      end
+      expect(subject).to eq(first)
     end
+  end
 
-    context 'when the merge request is not on merge train' do
-      let(:merge_request) { create(:merge_request) }
+  describe '#car_count' do
+    subject { train.car_count }
 
-      it 'returns empty array' do
-        is_expected.to be(0)
+    let(:cars) { [instance_double(MergeTrains::Car), instance_double(MergeTrains::Car)] }
+
+    it 'returns the count of the all_cars relation' do
+      allow_next_instance_of(MergeTrains::Train) do |train|
+        allow(train).to receive(:all_cars).and_return(cars)
       end
+
+      expect(subject).to eq(cars.length)
     end
   end
 
-  def create_merge_request_on_train(
-    target_project: project, target_branch: 'master', source_project: project,
-    source_branch: 'feature', status: :idle)
-    create(:merge_request,
-      :on_train,
-      target_branch: target_branch,
+  def create_merge_request_on_train(source_branch: 'feature', status: :idle)
+    create(:merge_request, :on_train,
+      source_project: target_project,
       target_project: target_project,
+      target_branch: 'master',
       source_branch: source_branch,
-      source_project: source_project,
       status: MergeTrains::Car.state_machines[:status].states[status].value)
   end
 end