diff --git a/changelogs/unreleased/26226-generate-all-haml-fixtures-within-teaspoon-fixtures-task.yml b/changelogs/unreleased/26226-generate-all-haml-fixtures-within-teaspoon-fixtures-task.yml
new file mode 100644
index 0000000000000000000000000000000000000000..28981291132a4a6541bec4072530b297c587d4cd
--- /dev/null
+++ b/changelogs/unreleased/26226-generate-all-haml-fixtures-within-teaspoon-fixtures-task.yml
@@ -0,0 +1,4 @@
+---
+title: Precompile all JavaScript fixtures
+merge_request: 8384
+author:
diff --git a/spec/javascripts/.eslintrc b/spec/javascripts/.eslintrc
index 7792acffac285691fe088a9b5d5b51d430868ed0..dcbcd014dc3c2730c05f4e411268e0872d18ee12 100644
--- a/spec/javascripts/.eslintrc
+++ b/spec/javascripts/.eslintrc
@@ -1,15 +1,28 @@
 {
-  "plugins": ["jasmine"],
   "env": {
     "jasmine": true
   },
   "extends": "plugin:jasmine/recommended",
+  "globals": {
+    "appendLoadFixtures": false,
+    "appendLoadStyleFixtures": false,
+    "appendSetFixtures": false,
+    "appendSetStyleFixtures": false,
+    "getJSONFixture": false,
+    "loadFixtures": false,
+    "loadJSONFixtures": false,
+    "loadStyleFixtures": false,
+    "preloadFixtures": false,
+    "preloadStyleFixtures": false,
+    "readFixtures": false,
+    "sandbox": false,
+    "setFixtures": false,
+    "setStyleFixtures": false,
+    "spyOnEvent": false
+  },
+  "plugins": ["jasmine"],
   "rules": {
     "prefer-arrow-callback": 0,
     "func-names": 0
-  },
-  "globals": {
-    "fixture": false,
-    "spyOnEvent": false
   }
 }
diff --git a/spec/javascripts/abuse_reports_spec.js.es6 b/spec/javascripts/abuse_reports_spec.js.es6
index 49e562495655be3ed9eb968a63fa712beca6ec64..cf19aa050315a0b1e56983d5bad83673fae5a811 100644
--- a/spec/javascripts/abuse_reports_spec.js.es6
+++ b/spec/javascripts/abuse_reports_spec.js.es6
@@ -13,10 +13,10 @@
       (index, element) => element.innerText.indexOf(searchText) > -1,
     ).first();
 
-    fixture.preload(FIXTURE);
+    preloadFixtures(FIXTURE);
 
     beforeEach(function () {
-      fixture.load(FIXTURE);
+      loadFixtures(FIXTURE);
       this.abuseReports = new global.AbuseReports();
       messages = $('.abuse-reports .message');
     });
diff --git a/spec/javascripts/activities_spec.js.es6 b/spec/javascripts/activities_spec.js.es6
index 192da4ee8d9acc8419fb6be799822fbf0cccbebf..b3617a45bd47207ffb67ea5acc3f552edee82e50 100644
--- a/spec/javascripts/activities_spec.js.es6
+++ b/spec/javascripts/activities_spec.js.es6
@@ -7,7 +7,7 @@
 
 (() => {
   window.gon || (window.gon = {});
-  const fixtureTemplate = 'event_filter.html';
+  const fixtureTemplate = 'static/event_filter.html.raw';
   const filters = [
     {
       id: 'all',
@@ -35,7 +35,7 @@
 
   describe('Activities', () => {
     beforeEach(() => {
-      fixture.load(fixtureTemplate);
+      loadFixtures(fixtureTemplate);
       new gl.Activities();
     });
 
diff --git a/spec/javascripts/awards_handler_spec.js b/spec/javascripts/awards_handler_spec.js
index 89201c8cb8b71c1de7ef5220910257405cbaa8a2..faba2837d419c07df28ccc5f6928bf9eda15ca3c 100644
--- a/spec/javascripts/awards_handler_spec.js
+++ b/spec/javascripts/awards_handler_spec.js
@@ -34,9 +34,9 @@
   };
 
   describe('AwardsHandler', function() {
-    fixture.preload('issues/open-issue.html.raw');
+    preloadFixtures('issues/open-issue.html.raw');
     beforeEach(function() {
-      fixture.load('issues/open-issue.html.raw');
+      loadFixtures('issues/open-issue.html.raw');
       awardsHandler = new AwardsHandler;
       spyOn(awardsHandler, 'postEmoji').and.callFake((function(_this) {
         return function(url, emoji, cb) {
diff --git a/spec/javascripts/behaviors/autosize_spec.js b/spec/javascripts/behaviors/autosize_spec.js
index b4573e53a4e01ec73acf6c8085acb68102c74e3d..e77d732a32a7a67d3246d191ab59cb9a150f3a92 100644
--- a/spec/javascripts/behaviors/autosize_spec.js
+++ b/spec/javascripts/behaviors/autosize_spec.js
@@ -6,7 +6,7 @@
   describe('Autosize behavior', function() {
     var load;
     beforeEach(function() {
-      return fixture.set('<textarea class="js-autosize" style="resize: vertical"></textarea>');
+      return setFixtures('<textarea class="js-autosize" style="resize: vertical"></textarea>');
     });
     it('does not overwrite the resize property', function() {
       load();
diff --git a/spec/javascripts/behaviors/quick_submit_spec.js b/spec/javascripts/behaviors/quick_submit_spec.js
index 0f61000bc37a28ac02cb4fa9865af0e1b85721ff..1a1f34cfdc08ee7b5162897e635c83d9379a7e0c 100644
--- a/spec/javascripts/behaviors/quick_submit_spec.js
+++ b/spec/javascripts/behaviors/quick_submit_spec.js
@@ -5,9 +5,9 @@
 (function() {
   describe('Quick Submit behavior', function() {
     var keydownEvent;
-    fixture.preload('behaviors/quick_submit.html');
+    preloadFixtures('static/behaviors/quick_submit.html.raw');
     beforeEach(function() {
-      fixture.load('behaviors/quick_submit.html');
+      loadFixtures('static/behaviors/quick_submit.html.raw');
       $('form').submit(function(e) {
         // Prevent a form submit from moving us off the testing page
         return e.preventDefault();
diff --git a/spec/javascripts/behaviors/requires_input_spec.js b/spec/javascripts/behaviors/requires_input_spec.js
index c3f4c867d6a346b0bc8c625fa126a864f18fdc80..1f62591c06d6e3f599726dc181ceef1dcaa15122 100644
--- a/spec/javascripts/behaviors/requires_input_spec.js
+++ b/spec/javascripts/behaviors/requires_input_spec.js
@@ -4,9 +4,9 @@
 
 (function() {
   describe('requiresInput', function() {
-    fixture.preload('behaviors/requires_input.html');
+    preloadFixtures('static/behaviors/requires_input.html.raw');
     beforeEach(function() {
-      return fixture.load('behaviors/requires_input.html');
+      return loadFixtures('static/behaviors/requires_input.html.raw');
     });
     it('disables submit when any field is required', function() {
       $('.js-requires-input').requiresInput();
diff --git a/spec/javascripts/bootstrap_linked_tabs_spec.js.es6 b/spec/javascripts/bootstrap_linked_tabs_spec.js.es6
index 133712debab56a2e025297bf87a377188e214e39..ea953d0f5a556b9aa5c76da61e868406196acc9a 100644
--- a/spec/javascripts/bootstrap_linked_tabs_spec.js.es6
+++ b/spec/javascripts/bootstrap_linked_tabs_spec.js.es6
@@ -2,10 +2,10 @@
 
 (() => {
   describe('Linked Tabs', () => {
-    fixture.preload('linked_tabs');
+    preloadFixtures('static/linked_tabs.html.raw');
 
     beforeEach(() => {
-      fixture.load('linked_tabs');
+      loadFixtures('static/linked_tabs.html.raw');
     });
 
     describe('when is initialized', () => {
diff --git a/spec/javascripts/build_spec.js.es6 b/spec/javascripts/build_spec.js.es6
index 3983cad4c137122cdaff5bd93b4aed2cbcfccbf5..0c556382980bb13b4307493b36a79be3003b0a6c 100644
--- a/spec/javascripts/build_spec.js.es6
+++ b/spec/javascripts/build_spec.js.es6
@@ -17,10 +17,10 @@ describe('Build', () => {
     offset: BUILD_TRACE.length, n_open_tags: 0, fg_color: null, bg_color: null, style_mask: 0,
   }));
 
-  fixture.preload('builds/build-with-artifacts.html.raw');
+  preloadFixtures('builds/build-with-artifacts.html.raw');
 
   beforeEach(() => {
-    fixture.load('builds/build-with-artifacts.html.raw');
+    loadFixtures('builds/build-with-artifacts.html.raw');
     spyOn($, 'ajax');
   });
 
diff --git a/spec/javascripts/dashboard_spec.js.es6 b/spec/javascripts/dashboard_spec.js.es6
index aadf6f518a86a5a2d80dbe6d035d0df225b9a286..3f6b328348de46fb1ee3eff2407b6497448de1e7 100644
--- a/spec/javascripts/dashboard_spec.js.es6
+++ b/spec/javascripts/dashboard_spec.js.es6
@@ -7,7 +7,7 @@
 
 ((global) => {
   describe('Dashboard', () => {
-    const fixtureTemplate = 'dashboard.html';
+    const fixtureTemplate = 'static/dashboard.html.raw';
 
     function todosCountText() {
       return $('.js-todos-count').text();
@@ -17,9 +17,9 @@
       $(document).trigger('todo:toggle', newCount);
     }
 
-    fixture.preload(fixtureTemplate);
+    preloadFixtures(fixtureTemplate);
     beforeEach(() => {
-      fixture.load(fixtureTemplate);
+      loadFixtures(fixtureTemplate);
       new global.Sidebar();
     });
 
diff --git a/spec/javascripts/environments/environment_actions_spec.js.es6 b/spec/javascripts/environments/environment_actions_spec.js.es6
index 4bae3f30bb5b00ad85e6d618f5d8e12594409a17..056e4d41e93e56b6a8067fb601c39646bd445179 100644
--- a/spec/javascripts/environments/environment_actions_spec.js.es6
+++ b/spec/javascripts/environments/environment_actions_spec.js.es6
@@ -2,10 +2,10 @@
 //= require environments/components/environment_actions
 
 describe('Actions Component', () => {
-  fixture.preload('environments/element.html');
+  preloadFixtures('static/environments/element.html.raw');
 
   beforeEach(() => {
-    fixture.load('environments/element.html');
+    loadFixtures('static/environments/element.html.raw');
   });
 
   it('should render a dropdown with the provided actions', () => {
diff --git a/spec/javascripts/environments/environment_external_url_spec.js.es6 b/spec/javascripts/environments/environment_external_url_spec.js.es6
index 9f82567c35b70a2ce7f6530656169ccc290e5cc6..950a5d53fad76021569336326ffe4fa601552ab8 100644
--- a/spec/javascripts/environments/environment_external_url_spec.js.es6
+++ b/spec/javascripts/environments/environment_external_url_spec.js.es6
@@ -2,9 +2,9 @@
 //= require environments/components/environment_external_url
 
 describe('External URL Component', () => {
-  fixture.preload('environments/element.html');
+  preloadFixtures('static/environments/element.html.raw');
   beforeEach(() => {
-    fixture.load('environments/element.html');
+    loadFixtures('static/environments/element.html.raw');
   });
 
   it('should link to the provided externalUrl prop', () => {
diff --git a/spec/javascripts/environments/environment_item_spec.js.es6 b/spec/javascripts/environments/environment_item_spec.js.es6
index 5d7c6b2411d050b242adc09060ab87fdb2400292..c178b9cc1ec17c4e33449e4b485d25f89cc551b8 100644
--- a/spec/javascripts/environments/environment_item_spec.js.es6
+++ b/spec/javascripts/environments/environment_item_spec.js.es6
@@ -3,9 +3,9 @@
 //= require environments/components/environment_item
 
 describe('Environment item', () => {
-  fixture.preload('environments/table.html');
+  preloadFixtures('static/environments/table.html.raw');
   beforeEach(() => {
-    fixture.load('environments/table.html');
+    loadFixtures('static/environments/table.html.raw');
   });
 
   describe('When item is folder', () => {
diff --git a/spec/javascripts/environments/environment_rollback_spec.js.es6 b/spec/javascripts/environments/environment_rollback_spec.js.es6
index 77ba0ab38eca1632ac167ebb0235f54f0701c0b0..21241116e29f86cbb9d85c9bd7d60a7d0e29db1a 100644
--- a/spec/javascripts/environments/environment_rollback_spec.js.es6
+++ b/spec/javascripts/environments/environment_rollback_spec.js.es6
@@ -1,12 +1,12 @@
 //= require vue
 //= require environments/components/environment_rollback
 describe('Rollback Component', () => {
-  fixture.preload('environments/element.html');
+  preloadFixtures('static/environments/element.html.raw');
 
   const retryURL = 'https://gitlab.com/retry';
 
   beforeEach(() => {
-    fixture.load('environments/element.html');
+    loadFixtures('static/environments/element.html.raw');
   });
 
   it('Should link to the provided retryUrl', () => {
diff --git a/spec/javascripts/environments/environment_stop_spec.js.es6 b/spec/javascripts/environments/environment_stop_spec.js.es6
index 84a41b2bf4678b9ca84b950b109c10fcecf1e916..bb998a32f32ff31f8d2d1ca3a4edf41a9d150b70 100644
--- a/spec/javascripts/environments/environment_stop_spec.js.es6
+++ b/spec/javascripts/environments/environment_stop_spec.js.es6
@@ -1,13 +1,13 @@
 //= require vue
 //= require environments/components/environment_stop
 describe('Stop Component', () => {
-  fixture.preload('environments/element.html');
+  preloadFixtures('static/environments/element.html.raw');
 
   let stopURL;
   let component;
 
   beforeEach(() => {
-    fixture.load('environments/element.html');
+    loadFixtures('static/environments/element.html.raw');
 
     stopURL = '/stop';
     component = new window.gl.environmentsList.StopComponent({
diff --git a/spec/javascripts/extensions/jquery_spec.js b/spec/javascripts/extensions/jquery_spec.js
index 76309930f27861decf6fd0ca4d5fa8d6fb00dcf1..91846bb9143bd7074f35f9db0e22f8dc93a4f696 100644
--- a/spec/javascripts/extensions/jquery_spec.js
+++ b/spec/javascripts/extensions/jquery_spec.js
@@ -6,7 +6,7 @@
   describe('jQuery extensions', function() {
     describe('disable', function() {
       beforeEach(function() {
-        return fixture.set('<input type="text" />');
+        return setFixtures('<input type="text" />');
       });
       it('adds the disabled attribute', function() {
         var $input;
@@ -23,7 +23,7 @@
     });
     return describe('enable', function() {
       beforeEach(function() {
-        return fixture.set('<input type="text" disabled="disabled" class="disabled" />');
+        return setFixtures('<input type="text" disabled="disabled" class="disabled" />');
       });
       it('removes the disabled attribute', function() {
         var $input;
diff --git a/spec/javascripts/fixtures/projects.json b/spec/javascripts/fixtures/projects.json
index 4919d77e5a46fa1a2b90b0753777694f8fe4cb65..4ce7f5c601aab978c8c2fe0ee1c0b686a9a40966 100644
--- a/spec/javascripts/fixtures/projects.json
+++ b/spec/javascripts/fixtures/projects.json
@@ -1 +1,445 @@
-[{"id":9,"description":"","default_branch":null,"tag_list":[],"public":true,"archived":false,"visibility_level":20,"ssh_url_to_repo":"phil@localhost:root/test.git","http_url_to_repo":"http://localhost:3000/root/test.git","web_url":"http://localhost:3000/root/test","owner":{"name":"Administrator","username":"root","id":1,"state":"active","avatar_url":"http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon","web_url":"http://localhost:3000/u/root"},"name":"test","name_with_namespace":"Administrator / test","path":"test","path_with_namespace":"root/test","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-14T19:08:05.364Z","last_activity_at":"2016-01-14T19:08:07.418Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":1,"name":"root","path":"root","owner_id":1,"created_at":"2016-01-13T20:19:44.439Z","updated_at":"2016-01-13T20:19:44.439Z","description":"","avatar":null},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":0,"permissions":{"project_access":null,"group_access":null}},{"id":8,"description":"Voluptatem quae nulla eius numquam ullam voluptatibus quia modi.","default_branch":"master","tag_list":[],"public":false,"archived":false,"visibility_level":0,"ssh_url_to_repo":"phil@localhost:h5bp/html5-boilerplate.git","http_url_to_repo":"http://localhost:3000/h5bp/html5-boilerplate.git","web_url":"http://localhost:3000/h5bp/html5-boilerplate","name":"Html5 Boilerplate","name_with_namespace":"H5bp / Html5 Boilerplate","path":"html5-boilerplate","path_with_namespace":"h5bp/html5-boilerplate","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:57.525Z","last_activity_at":"2016-01-13T20:27:57.280Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":5,"name":"H5bp","path":"h5bp","owner_id":null,"created_at":"2016-01-13T20:19:57.239Z","updated_at":"2016-01-13T20:19:57.239Z","description":"Tempore accusantium possimus aut libero.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":5,"permissions":{"project_access":{"access_level":10,"notification_level":3},"group_access":{"access_level":50,"notification_level":3}}},{"id":7,"description":"Modi odio mollitia dolorem qui.","default_branch":"master","tag_list":[],"public":false,"archived":false,"visibility_level":0,"ssh_url_to_repo":"phil@localhost:twitter/typeahead-js.git","http_url_to_repo":"http://localhost:3000/twitter/typeahead-js.git","web_url":"http://localhost:3000/twitter/typeahead-js","name":"Typeahead.Js","name_with_namespace":"Twitter / Typeahead.Js","path":"typeahead-js","path_with_namespace":"twitter/typeahead-js","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:56.212Z","last_activity_at":"2016-01-13T20:27:51.496Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":4,"name":"Twitter","path":"twitter","owner_id":null,"created_at":"2016-01-13T20:19:54.480Z","updated_at":"2016-01-13T20:19:54.480Z","description":"Id voluptatem ipsa maiores omnis repudiandae et et.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":true,"open_issues_count":4,"permissions":{"project_access":null,"group_access":{"access_level":10,"notification_level":3}}},{"id":6,"description":"Omnis asperiores ipsa et beatae quidem necessitatibus quia.","default_branch":"master","tag_list":[],"public":true,"archived":false,"visibility_level":20,"ssh_url_to_repo":"phil@localhost:twitter/flight.git","http_url_to_repo":"http://localhost:3000/twitter/flight.git","web_url":"http://localhost:3000/twitter/flight","name":"Flight","name_with_namespace":"Twitter / Flight","path":"flight","path_with_namespace":"twitter/flight","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:54.754Z","last_activity_at":"2016-01-13T20:27:50.502Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":4,"name":"Twitter","path":"twitter","owner_id":null,"created_at":"2016-01-13T20:19:54.480Z","updated_at":"2016-01-13T20:19:54.480Z","description":"Id voluptatem ipsa maiores omnis repudiandae et et.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":true,"open_issues_count":4,"permissions":{"project_access":null,"group_access":{"access_level":10,"notification_level":3}}},{"id":5,"description":"Voluptatem commodi voluptate placeat architecto beatae illum dolores fugiat.","default_branch":"master","tag_list":[],"public":false,"archived":false,"visibility_level":0,"ssh_url_to_repo":"phil@localhost:gitlab-org/gitlab-test.git","http_url_to_repo":"http://localhost:3000/gitlab-org/gitlab-test.git","web_url":"http://localhost:3000/gitlab-org/gitlab-test","name":"Gitlab Test","name_with_namespace":"Gitlab Org / Gitlab Test","path":"gitlab-test","path_with_namespace":"gitlab-org/gitlab-test","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:53.202Z","last_activity_at":"2016-01-13T20:27:41.626Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":3,"name":"Gitlab Org","path":"gitlab-org","owner_id":null,"created_at":"2016-01-13T20:19:48.851Z","updated_at":"2016-01-13T20:19:48.851Z","description":"Magni mollitia quod quidem soluta nesciunt impedit.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":5,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}},{"id":4,"description":"Aut molestias quas est ut aperiam officia quod libero.","default_branch":"master","tag_list":[],"public":true,"archived":false,"visibility_level":20,"ssh_url_to_repo":"phil@localhost:gitlab-org/gitlab-shell.git","http_url_to_repo":"http://localhost:3000/gitlab-org/gitlab-shell.git","web_url":"http://localhost:3000/gitlab-org/gitlab-shell","name":"Gitlab Shell","name_with_namespace":"Gitlab Org / Gitlab Shell","path":"gitlab-shell","path_with_namespace":"gitlab-org/gitlab-shell","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:51.882Z","last_activity_at":"2016-01-13T20:27:35.678Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":3,"name":"Gitlab Org","path":"gitlab-org","owner_id":null,"created_at":"2016-01-13T20:19:48.851Z","updated_at":"2016-01-13T20:19:48.851Z","description":"Magni mollitia quod quidem soluta nesciunt impedit.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":5,"permissions":{"project_access":{"access_level":20,"notification_level":3},"group_access":{"access_level":50,"notification_level":3}}},{"id":3,"description":"Excepturi molestiae quia repellendus omnis est illo illum eligendi.","default_branch":"master","tag_list":[],"public":true,"archived":false,"visibility_level":20,"ssh_url_to_repo":"phil@localhost:gitlab-org/gitlab-ci.git","http_url_to_repo":"http://localhost:3000/gitlab-org/gitlab-ci.git","web_url":"http://localhost:3000/gitlab-org/gitlab-ci","name":"Gitlab Ci","name_with_namespace":"Gitlab Org / Gitlab Ci","path":"gitlab-ci","path_with_namespace":"gitlab-org/gitlab-ci","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:50.346Z","last_activity_at":"2016-01-13T20:27:30.115Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":3,"name":"Gitlab Org","path":"gitlab-org","owner_id":null,"created_at":"2016-01-13T20:19:48.851Z","updated_at":"2016-01-13T20:19:48.851Z","description":"Magni mollitia quod quidem soluta nesciunt impedit.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":3,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}},{"id":2,"description":"Adipisci quaerat dignissimos enim sed ipsam dolorem quia.","default_branch":"master","tag_list":[],"public":false,"archived":false,"visibility_level":10,"ssh_url_to_repo":"phil@localhost:gitlab-org/gitlab-ce.git","http_url_to_repo":"http://localhost:3000/gitlab-org/gitlab-ce.git","web_url":"http://localhost:3000/gitlab-org/gitlab-ce","name":"Gitlab Ce","name_with_namespace":"Gitlab Org / Gitlab Ce","path":"gitlab-ce","path_with_namespace":"gitlab-org/gitlab-ce","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:49.065Z","last_activity_at":"2016-01-13T20:26:58.454Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":3,"name":"Gitlab Org","path":"gitlab-org","owner_id":null,"created_at":"2016-01-13T20:19:48.851Z","updated_at":"2016-01-13T20:19:48.851Z","description":"Magni mollitia quod quidem soluta nesciunt impedit.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":5,"permissions":{"project_access":{"access_level":30,"notification_level":3},"group_access":{"access_level":50,"notification_level":3}}},{"id":1,"description":"Vel voluptatem maxime saepe ex quia.","default_branch":"master","tag_list":[],"public":false,"archived":false,"visibility_level":0,"ssh_url_to_repo":"phil@localhost:documentcloud/underscore.git","http_url_to_repo":"http://localhost:3000/documentcloud/underscore.git","web_url":"http://localhost:3000/documentcloud/underscore","name":"Underscore","name_with_namespace":"Documentcloud / Underscore","path":"underscore","path_with_namespace":"documentcloud/underscore","issues_enabled":true,"merge_requests_enabled":true,"wiki_enabled":true,"builds_enabled":true,"snippets_enabled":false,"created_at":"2016-01-13T20:19:45.862Z","last_activity_at":"2016-01-13T20:25:03.106Z","shared_runners_enabled":true,"creator_id":1,"namespace":{"id":2,"name":"Documentcloud","path":"documentcloud","owner_id":null,"created_at":"2016-01-13T20:19:44.464Z","updated_at":"2016-01-13T20:19:44.464Z","description":"Aut impedit perferendis fuga et ipsa repellat cupiditate et.","avatar":{"url":null}},"avatar_url":null,"star_count":0,"forks_count":0,"only_allow_merge_if_build_succeeds":false,"open_issues_count":5,"permissions":{"project_access":null,"group_access":{"access_level":50,"notification_level":3}}}]
+[{
+  "id": 9,
+  "description": "",
+  "default_branch": null,
+  "tag_list": [],
+  "public": true,
+  "archived": false,
+  "visibility_level": 20,
+  "ssh_url_to_repo": "phil@localhost:root/test.git",
+  "http_url_to_repo": "http://localhost:3000/root/test.git",
+  "web_url": "http://localhost:3000/root/test",
+  "owner": {
+    "name": "Administrator",
+    "username": "root",
+    "id": 1,
+    "state": "active",
+    "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
+    "web_url": "http://localhost:3000/u/root"
+  },
+  "name": "test",
+  "name_with_namespace": "Administrator / test",
+  "path": "test",
+  "path_with_namespace": "root/test",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-14T19:08:05.364Z",
+  "last_activity_at": "2016-01-14T19:08:07.418Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 1,
+    "name": "root",
+    "path": "root",
+    "owner_id": 1,
+    "created_at": "2016-01-13T20:19:44.439Z",
+    "updated_at": "2016-01-13T20:19:44.439Z",
+    "description": "",
+    "avatar": null
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 0,
+  "permissions": {
+    "project_access": null,
+    "group_access": null
+  }
+}, {
+  "id": 8,
+  "description": "Voluptatem quae nulla eius numquam ullam voluptatibus quia modi.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": false,
+  "archived": false,
+  "visibility_level": 0,
+  "ssh_url_to_repo": "phil@localhost:h5bp/html5-boilerplate.git",
+  "http_url_to_repo": "http://localhost:3000/h5bp/html5-boilerplate.git",
+  "web_url": "http://localhost:3000/h5bp/html5-boilerplate",
+  "name": "Html5 Boilerplate",
+  "name_with_namespace": "H5bp / Html5 Boilerplate",
+  "path": "html5-boilerplate",
+  "path_with_namespace": "h5bp/html5-boilerplate",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:57.525Z",
+  "last_activity_at": "2016-01-13T20:27:57.280Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 5,
+    "name": "H5bp",
+    "path": "h5bp",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:57.239Z",
+    "updated_at": "2016-01-13T20:19:57.239Z",
+    "description": "Tempore accusantium possimus aut libero.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 5,
+  "permissions": {
+    "project_access": {
+      "access_level": 10,
+      "notification_level": 3
+    },
+    "group_access": {
+      "access_level": 50,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 7,
+  "description": "Modi odio mollitia dolorem qui.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": false,
+  "archived": false,
+  "visibility_level": 0,
+  "ssh_url_to_repo": "phil@localhost:twitter/typeahead-js.git",
+  "http_url_to_repo": "http://localhost:3000/twitter/typeahead-js.git",
+  "web_url": "http://localhost:3000/twitter/typeahead-js",
+  "name": "Typeahead.Js",
+  "name_with_namespace": "Twitter / Typeahead.Js",
+  "path": "typeahead-js",
+  "path_with_namespace": "twitter/typeahead-js",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:56.212Z",
+  "last_activity_at": "2016-01-13T20:27:51.496Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 4,
+    "name": "Twitter",
+    "path": "twitter",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:54.480Z",
+    "updated_at": "2016-01-13T20:19:54.480Z",
+    "description": "Id voluptatem ipsa maiores omnis repudiandae et et.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": true,
+  "open_issues_count": 4,
+  "permissions": {
+    "project_access": null,
+    "group_access": {
+      "access_level": 10,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 6,
+  "description": "Omnis asperiores ipsa et beatae quidem necessitatibus quia.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": true,
+  "archived": false,
+  "visibility_level": 20,
+  "ssh_url_to_repo": "phil@localhost:twitter/flight.git",
+  "http_url_to_repo": "http://localhost:3000/twitter/flight.git",
+  "web_url": "http://localhost:3000/twitter/flight",
+  "name": "Flight",
+  "name_with_namespace": "Twitter / Flight",
+  "path": "flight",
+  "path_with_namespace": "twitter/flight",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:54.754Z",
+  "last_activity_at": "2016-01-13T20:27:50.502Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 4,
+    "name": "Twitter",
+    "path": "twitter",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:54.480Z",
+    "updated_at": "2016-01-13T20:19:54.480Z",
+    "description": "Id voluptatem ipsa maiores omnis repudiandae et et.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": true,
+  "open_issues_count": 4,
+  "permissions": {
+    "project_access": null,
+    "group_access": {
+      "access_level": 10,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 5,
+  "description": "Voluptatem commodi voluptate placeat architecto beatae illum dolores fugiat.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": false,
+  "archived": false,
+  "visibility_level": 0,
+  "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-test.git",
+  "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-test.git",
+  "web_url": "http://localhost:3000/gitlab-org/gitlab-test",
+  "name": "Gitlab Test",
+  "name_with_namespace": "Gitlab Org / Gitlab Test",
+  "path": "gitlab-test",
+  "path_with_namespace": "gitlab-org/gitlab-test",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:53.202Z",
+  "last_activity_at": "2016-01-13T20:27:41.626Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 3,
+    "name": "Gitlab Org",
+    "path": "gitlab-org",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:48.851Z",
+    "updated_at": "2016-01-13T20:19:48.851Z",
+    "description": "Magni mollitia quod quidem soluta nesciunt impedit.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 5,
+  "permissions": {
+    "project_access": null,
+    "group_access": {
+      "access_level": 50,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 4,
+  "description": "Aut molestias quas est ut aperiam officia quod libero.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": true,
+  "archived": false,
+  "visibility_level": 20,
+  "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-shell.git",
+  "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-shell.git",
+  "web_url": "http://localhost:3000/gitlab-org/gitlab-shell",
+  "name": "Gitlab Shell",
+  "name_with_namespace": "Gitlab Org / Gitlab Shell",
+  "path": "gitlab-shell",
+  "path_with_namespace": "gitlab-org/gitlab-shell",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:51.882Z",
+  "last_activity_at": "2016-01-13T20:27:35.678Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 3,
+    "name": "Gitlab Org",
+    "path": "gitlab-org",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:48.851Z",
+    "updated_at": "2016-01-13T20:19:48.851Z",
+    "description": "Magni mollitia quod quidem soluta nesciunt impedit.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 5,
+  "permissions": {
+    "project_access": {
+      "access_level": 20,
+      "notification_level": 3
+    },
+    "group_access": {
+      "access_level": 50,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 3,
+  "description": "Excepturi molestiae quia repellendus omnis est illo illum eligendi.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": true,
+  "archived": false,
+  "visibility_level": 20,
+  "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-ci.git",
+  "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-ci.git",
+  "web_url": "http://localhost:3000/gitlab-org/gitlab-ci",
+  "name": "Gitlab Ci",
+  "name_with_namespace": "Gitlab Org / Gitlab Ci",
+  "path": "gitlab-ci",
+  "path_with_namespace": "gitlab-org/gitlab-ci",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:50.346Z",
+  "last_activity_at": "2016-01-13T20:27:30.115Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 3,
+    "name": "Gitlab Org",
+    "path": "gitlab-org",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:48.851Z",
+    "updated_at": "2016-01-13T20:19:48.851Z",
+    "description": "Magni mollitia quod quidem soluta nesciunt impedit.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 3,
+  "permissions": {
+    "project_access": null,
+    "group_access": {
+      "access_level": 50,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 2,
+  "description": "Adipisci quaerat dignissimos enim sed ipsam dolorem quia.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": false,
+  "archived": false,
+  "visibility_level": 10,
+  "ssh_url_to_repo": "phil@localhost:gitlab-org/gitlab-ce.git",
+  "http_url_to_repo": "http://localhost:3000/gitlab-org/gitlab-ce.git",
+  "web_url": "http://localhost:3000/gitlab-org/gitlab-ce",
+  "name": "Gitlab Ce",
+  "name_with_namespace": "Gitlab Org / Gitlab Ce",
+  "path": "gitlab-ce",
+  "path_with_namespace": "gitlab-org/gitlab-ce",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:49.065Z",
+  "last_activity_at": "2016-01-13T20:26:58.454Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 3,
+    "name": "Gitlab Org",
+    "path": "gitlab-org",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:48.851Z",
+    "updated_at": "2016-01-13T20:19:48.851Z",
+    "description": "Magni mollitia quod quidem soluta nesciunt impedit.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 5,
+  "permissions": {
+    "project_access": {
+      "access_level": 30,
+      "notification_level": 3
+    },
+    "group_access": {
+      "access_level": 50,
+      "notification_level": 3
+    }
+  }
+}, {
+  "id": 1,
+  "description": "Vel voluptatem maxime saepe ex quia.",
+  "default_branch": "master",
+  "tag_list": [],
+  "public": false,
+  "archived": false,
+  "visibility_level": 0,
+  "ssh_url_to_repo": "phil@localhost:documentcloud/underscore.git",
+  "http_url_to_repo": "http://localhost:3000/documentcloud/underscore.git",
+  "web_url": "http://localhost:3000/documentcloud/underscore",
+  "name": "Underscore",
+  "name_with_namespace": "Documentcloud / Underscore",
+  "path": "underscore",
+  "path_with_namespace": "documentcloud/underscore",
+  "issues_enabled": true,
+  "merge_requests_enabled": true,
+  "wiki_enabled": true,
+  "builds_enabled": true,
+  "snippets_enabled": false,
+  "created_at": "2016-01-13T20:19:45.862Z",
+  "last_activity_at": "2016-01-13T20:25:03.106Z",
+  "shared_runners_enabled": true,
+  "creator_id": 1,
+  "namespace": {
+    "id": 2,
+    "name": "Documentcloud",
+    "path": "documentcloud",
+    "owner_id": null,
+    "created_at": "2016-01-13T20:19:44.464Z",
+    "updated_at": "2016-01-13T20:19:44.464Z",
+    "description": "Aut impedit perferendis fuga et ipsa repellat cupiditate et.",
+    "avatar": {
+      "url": null
+    }
+  },
+  "avatar_url": null,
+  "star_count": 0,
+  "forks_count": 0,
+  "only_allow_merge_if_build_succeeds": false,
+  "open_issues_count": 5,
+  "permissions": {
+    "project_access": null,
+    "group_access": {
+      "access_level": 50,
+      "notification_level": 3
+    }
+  }
+}]
diff --git a/spec/javascripts/fixtures/static_fixtures.rb b/spec/javascripts/fixtures/static_fixtures.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4569f16f0cab9782a87812a28a2259d3c0ee739d
--- /dev/null
+++ b/spec/javascripts/fixtures/static_fixtures.rb
@@ -0,0 +1,31 @@
+require 'spec_helper'
+
+describe ApplicationController, '(Static JavaScript fixtures)', type: :controller do
+  include JavaScriptFixturesHelpers
+
+  before(:all) do
+    clean_frontend_fixtures('static/')
+  end
+
+  fixtures_path = File.expand_path(JavaScriptFixturesHelpers::FIXTURE_PATH, Rails.root)
+  haml_fixtures = Dir.glob(File.expand_path('**/*.haml', fixtures_path)).map do |file_path|
+    file_path.sub(/\A#{fixtures_path}#{File::SEPARATOR}/, '')
+  end
+
+  haml_fixtures.each do |template_file_name|
+    it "static/#{template_file_name.sub(/\.haml\z/, '.raw')}" do |example|
+      fixture_file_name = example.description
+      rendered = render_template(template_file_name)
+      store_frontend_fixture(rendered, fixture_file_name)
+    end
+  end
+
+  private
+
+  def render_template(template_file_name)
+    fixture_path = JavaScriptFixturesHelpers::FIXTURE_PATH
+    controller = ApplicationController.new
+    controller.prepend_view_path(fixture_path)
+    controller.render_to_string(template: template_file_name, layout: false)
+  end
+end
diff --git a/spec/javascripts/gl_dropdown_spec.js.es6 b/spec/javascripts/gl_dropdown_spec.js.es6
index bfaf90e2aeec592f12ea966a7cb5f4b395b8e39a..ce96571bd52e28c0be3ff96e9d80e716f45bafa2 100644
--- a/spec/javascripts/gl_dropdown_spec.js.es6
+++ b/spec/javascripts/gl_dropdown_spec.js.es6
@@ -43,8 +43,7 @@
   }
 
   describe('Dropdown', function describeDropdown() {
-    fixture.preload('gl_dropdown.html');
-    fixture.preload('projects.json');
+    preloadFixtures('static/gl_dropdown.html.raw');
 
     function initDropDown(hasRemote, isFilterable) {
       this.dropdownButtonElement = $('#js-project-dropdown', this.dropdownContainerElement).glDropdown({
@@ -61,10 +60,10 @@
     }
 
     beforeEach(() => {
-      fixture.load('gl_dropdown.html');
+      loadFixtures('static/gl_dropdown.html.raw');
       this.dropdownContainerElement = $('.dropdown.inline');
       this.$dropdownMenuElement = $('.dropdown-menu', this.dropdownContainerElement);
-      this.projectsData = fixture.load('projects.json')[0];
+      this.projectsData = getJSONFixture('projects.json');
     });
 
     afterEach(() => {
diff --git a/spec/javascripts/gl_field_errors_spec.js.es6 b/spec/javascripts/gl_field_errors_spec.js.es6
index 5018e87ad6c8205845276f90636659896e4c6a45..e5d934540af258e9c11ff86975aca48963cd4bf2 100644
--- a/spec/javascripts/gl_field_errors_spec.js.es6
+++ b/spec/javascripts/gl_field_errors_spec.js.es6
@@ -4,11 +4,11 @@
 //= require gl_field_errors
 
 ((global) => {
-  fixture.preload('gl_field_errors.html');
+  preloadFixtures('static/gl_field_errors.html.raw');
 
   describe('GL Style Field Errors', function() {
     beforeEach(function() {
-      fixture.load('gl_field_errors.html');
+      loadFixtures('static/gl_field_errors.html.raw');
       const $form = this.$form = $('form.gl-show-field-errors');
       this.fieldErrors = new global.GlFieldErrors($form);
     });
diff --git a/spec/javascripts/header_spec.js b/spec/javascripts/header_spec.js
index d2bcbc37b649b2bd08932143e4661aa356e2c97b..b5262afa1cfb4406b70338cc13bd8797cca8d256 100644
--- a/spec/javascripts/header_spec.js
+++ b/spec/javascripts/header_spec.js
@@ -7,7 +7,7 @@
 
   describe('Header', function() {
     var todosPendingCount = '.todos-pending-count';
-    var fixtureTemplate = 'header.html';
+    var fixtureTemplate = 'static/header.html.raw';
 
     function isTodosCountHidden() {
       return $(todosPendingCount).hasClass('hidden');
@@ -17,9 +17,9 @@
       $(document).trigger('todo:toggle', newCount);
     }
 
-    fixture.preload(fixtureTemplate);
+    preloadFixtures(fixtureTemplate);
     beforeEach(function() {
-      fixture.load(fixtureTemplate);
+      loadFixtures(fixtureTemplate);
     });
 
     it('should update todos-pending-count after receiving the todo:toggle event', function() {
diff --git a/spec/javascripts/issuable_spec.js.es6 b/spec/javascripts/issuable_spec.js.es6
index d61601ee4fbc9ebca0b045ed34ed2aa5e6d04d07..917a6267b9229e1ddd197c981aa946bcfadb7bb7 100644
--- a/spec/javascripts/issuable_spec.js.es6
+++ b/spec/javascripts/issuable_spec.js.es6
@@ -21,10 +21,10 @@
   }
 
   describe('Issuable', () => {
-    fixture.preload('issuable_filter');
+    preloadFixtures('static/issuable_filter.html.raw');
 
     beforeEach(() => {
-      fixture.load('issuable_filter');
+      loadFixtures('static/issuable_filter.html.raw');
       Issuable.init();
     });
 
@@ -37,7 +37,7 @@
 
       beforeEach(() => {
         $filtersForm = $('.js-filter-form');
-        fixture.load('issuable_filter');
+        loadFixtures('static/issuable_filter.html.raw');
         resetForm($filtersForm);
       });
 
diff --git a/spec/javascripts/issue_spec.js b/spec/javascripts/issue_spec.js
index faab5ae00c2fad5f30fe213ae022b2926b14b290..eb07421826c95e053eb4cbbd7e277da354f3c7d7 100644
--- a/spec/javascripts/issue_spec.js
+++ b/spec/javascripts/issue_spec.js
@@ -8,9 +8,9 @@
   var INVALID_URL = 'http://goesnowhere.nothing/whereami';
   var $boxClosed, $boxOpen, $btnClose, $btnReopen;
 
-  fixture.preload('issues/closed-issue.html');
-  fixture.preload('issues/issue-with-task-list.html');
-  fixture.preload('issues/open-issue.html');
+  preloadFixtures('issues/closed-issue.html.raw');
+  preloadFixtures('issues/issue-with-task-list.html.raw');
+  preloadFixtures('issues/open-issue.html.raw');
 
   function expectErrorMessage() {
     var $flashMessage = $('div.flash-alert');
@@ -61,8 +61,8 @@
 
   describe('Issue', function() {
     describe('task lists', function() {
-      fixture.load('issues/issue-with-task-list.html');
       beforeEach(function() {
+        loadFixtures('issues/issue-with-task-list.html.raw');
         this.issue = new Issue();
       });
 
@@ -86,7 +86,7 @@
 
   describe('close issue', function() {
     beforeEach(function() {
-      fixture.load('issues/open-issue.html');
+      loadFixtures('issues/open-issue.html.raw');
       findElements();
       this.issue = new Issue();
 
@@ -140,7 +140,7 @@
 
   describe('reopen issue', function() {
     beforeEach(function() {
-      fixture.load('issues/closed-issue.html');
+      loadFixtures('issues/closed-issue.html.raw');
       findElements();
       this.issue = new Issue();
 
diff --git a/spec/javascripts/labels_issue_sidebar_spec.js.es6 b/spec/javascripts/labels_issue_sidebar_spec.js.es6
index 0c48d04776fb03b68f7ac9d830320a9ae9ef9d27..e3146559a4a44f1bf4f636091d8d8a3761ce98ba 100644
--- a/spec/javascripts/labels_issue_sidebar_spec.js.es6
+++ b/spec/javascripts/labels_issue_sidebar_spec.js.es6
@@ -17,10 +17,10 @@
 (() => {
   let saveLabelCount = 0;
   describe('Issue dropdown sidebar', () => {
-    fixture.preload('issue_sidebar_label.html');
+    preloadFixtures('static/issue_sidebar_label.html.raw');
 
     beforeEach(() => {
-      fixture.load('issue_sidebar_label.html');
+      loadFixtures('static/issue_sidebar_label.html.raw');
       new IssuableContext('{"id":1,"name":"Administrator","username":"root"}');
       new LabelsSelect();
 
diff --git a/spec/javascripts/line_highlighter_spec.js b/spec/javascripts/line_highlighter_spec.js
index decdf583410c333aa4074074940700e6e7a7153c..31f516b41bfc874f7d19c2dc006d405b1aba67d2 100644
--- a/spec/javascripts/line_highlighter_spec.js
+++ b/spec/javascripts/line_highlighter_spec.js
@@ -6,7 +6,7 @@
 (function() {
   describe('LineHighlighter', function() {
     var clickLine;
-    fixture.preload('line_highlighter.html');
+    preloadFixtures('static/line_highlighter.html.raw');
     clickLine = function(number, eventData) {
       var e;
       if (eventData == null) {
@@ -20,7 +20,7 @@
       }
     };
     beforeEach(function() {
-      fixture.load('line_highlighter.html');
+      loadFixtures('static/line_highlighter.html.raw');
       this["class"] = new LineHighlighter();
       this.css = this["class"].highlightClass;
       return this.spies = {
diff --git a/spec/javascripts/merge_request_spec.js b/spec/javascripts/merge_request_spec.js
index 4cf1693af1b25fabe005d419568111fc8abc7360..9b232617fe53abb9467f38697ea3362f617fb122 100644
--- a/spec/javascripts/merge_request_spec.js
+++ b/spec/javascripts/merge_request_spec.js
@@ -6,9 +6,9 @@
 (function() {
   describe('MergeRequest', function() {
     return describe('task lists', function() {
-      fixture.preload('merge_requests_show.html');
+      preloadFixtures('static/merge_requests_show.html.raw');
       beforeEach(function() {
-        fixture.load('merge_requests_show.html');
+        loadFixtures('static/merge_requests_show.html.raw');
         return this.merge = new MergeRequest();
       });
       it('modifies the Markdown field', function() {
diff --git a/spec/javascripts/merge_request_tabs_spec.js b/spec/javascripts/merge_request_tabs_spec.js
index 130d391bfab30b15136b3982ef1058b7985e73a5..98201fb98ed5afd4461d04cd810507b41593e0b1 100644
--- a/spec/javascripts/merge_request_tabs_spec.js
+++ b/spec/javascripts/merge_request_tabs_spec.js
@@ -16,7 +16,7 @@
       };
       $.extend(stubLocation, defaults, stubs || {});
     };
-    fixture.preload('merge_request_tabs.html');
+    preloadFixtures('static/merge_request_tabs.html.raw');
 
     beforeEach(function () {
       this.class = new gl.MergeRequestTabs({ stubLocation: stubLocation });
@@ -30,7 +30,7 @@
     describe('#activateTab', function () {
       beforeEach(function () {
         spyOn($, 'ajax').and.callFake(function () {});
-        fixture.load('merge_request_tabs.html');
+        loadFixtures('static/merge_request_tabs.html.raw');
         this.subject = this.class.activateTab;
       });
       it('shows the first tab when action is show', function () {
diff --git a/spec/javascripts/mini_pipeline_graph_dropdown_spec.js.es6 b/spec/javascripts/mini_pipeline_graph_dropdown_spec.js.es6
index d1793e9308e32b45a656a563fd23aa166b2a7189..a1c2fe3df374e9cad2a71df9bd7fb29ffca55707 100644
--- a/spec/javascripts/mini_pipeline_graph_dropdown_spec.js.es6
+++ b/spec/javascripts/mini_pipeline_graph_dropdown_spec.js.es6
@@ -5,10 +5,10 @@
 
 (() => {
   describe('Mini Pipeline Graph Dropdown', () => {
-    fixture.preload('mini_dropdown_graph');
+    preloadFixtures('static/mini_dropdown_graph.html.raw');
 
     beforeEach(() => {
-      fixture.load('mini_dropdown_graph');
+      loadFixtures('static/mini_dropdown_graph.html.raw');
     });
 
     describe('When is initialized', () => {
diff --git a/spec/javascripts/new_branch_spec.js b/spec/javascripts/new_branch_spec.js
index a6cb9e4774454d515f0ceaefc5ef49cb2984859d..e0dc549a9f4eaa306d88a65becf72171598ca907 100644
--- a/spec/javascripts/new_branch_spec.js
+++ b/spec/javascripts/new_branch_spec.js
@@ -8,7 +8,7 @@
   describe('Branch', function() {
     return describe('create a new branch', function() {
       var expectToHaveError, fillNameWith;
-      fixture.preload('new_branch.html');
+      preloadFixtures('static/new_branch.html.raw');
       fillNameWith = function(value) {
         return $('.js-branch-name').val(value).trigger('blur');
       };
@@ -16,7 +16,7 @@
         return expect($('.js-branch-name-error span').text()).toEqual(error);
       };
       beforeEach(function() {
-        fixture.load('new_branch.html');
+        loadFixtures('static/new_branch.html.raw');
         $('form').on('submit', function(e) {
           return e.preventDefault();
         });
diff --git a/spec/javascripts/notes_spec.js b/spec/javascripts/notes_spec.js
index bb13af7ac0c1f02ed6d2efdcdd2a5dce462904e6..9cdb0a5d5aaf9b8351dbbaa7d9069d0b0e969e8c 100644
--- a/spec/javascripts/notes_spec.js
+++ b/spec/javascripts/notes_spec.js
@@ -12,11 +12,11 @@
   gl.utils = gl.utils || {};
 
   describe('Notes', function() {
-    var commentsTemplate = 'issues/issue_with_comment.raw';
-    fixture.preload(commentsTemplate);
+    var commentsTemplate = 'issues/issue_with_comment.html.raw';
+    preloadFixtures(commentsTemplate);
 
     beforeEach(function () {
-      fixture.load(commentsTemplate);
+      loadFixtures(commentsTemplate);
       gl.utils.disableButtonIfEmptyField = _.noop;
       window.project_uploads_path = 'http://test.host/uploads';
       $('body').data('page', 'projects:issues:show');
diff --git a/spec/javascripts/pipelines_spec.js.es6 b/spec/javascripts/pipelines_spec.js.es6
index 85c9cf4b4f1d0f3f2c1090b38c3a66d1eaa22a85..f0f9ad7430d5ed5b492807539ffad030b2b4f4e3 100644
--- a/spec/javascripts/pipelines_spec.js.es6
+++ b/spec/javascripts/pipelines_spec.js.es6
@@ -2,10 +2,10 @@
 
 (() => {
   describe('Pipelines', () => {
-    fixture.preload('pipeline_graph');
+    preloadFixtures('static/pipeline_graph.html.raw');
 
     beforeEach(() => {
-      fixture.load('pipeline_graph');
+      loadFixtures('static/pipeline_graph.html.raw');
     });
 
     it('should be defined', () => {
diff --git a/spec/javascripts/project_title_spec.js b/spec/javascripts/project_title_spec.js
index 216b77f37c024172be2510dc6fafa782419edd15..27b071f266d4d8e2b66b2cf0071fb3475193d9cd 100644
--- a/spec/javascripts/project_title_spec.js
+++ b/spec/javascripts/project_title_spec.js
@@ -16,10 +16,9 @@
   window.gon.api_version = 'v3';
 
   describe('Project Title', function() {
-    fixture.preload('project_title.html');
-    fixture.preload('projects.json');
+    preloadFixtures('static/project_title.html.raw');
     beforeEach(function() {
-      fixture.load('project_title.html');
+      loadFixtures('static/project_title.html.raw');
       return this.project = new Project();
     });
     return describe('project list', function() {
@@ -34,7 +33,7 @@
 
       beforeEach((function(_this) {
         return function() {
-          _this.projects_data = fixture.load('projects.json')[0];
+          _this.projects_data = getJSONFixture('projects.json');
           return spyOn(jQuery, 'ajax').and.callFake(fakeAjaxResponse.bind(_this));
         };
       })(this));
diff --git a/spec/javascripts/right_sidebar_spec.js b/spec/javascripts/right_sidebar_spec.js
index a083dbf033a217cba784f95d114e6da4a93729ee..0177d8e4e7992940b16989b43a60d7a7088f501f 100644
--- a/spec/javascripts/right_sidebar_spec.js
+++ b/spec/javascripts/right_sidebar_spec.js
@@ -36,9 +36,9 @@
 
   describe('RightSidebar', function() {
     var fixtureName = 'issues/open-issue.html.raw';
-    fixture.preload(fixtureName);
+    preloadFixtures(fixtureName);
     beforeEach(function() {
-      fixture.load(fixtureName);
+      loadFixtures(fixtureName);
       this.sidebar = new Sidebar;
       $aside = $('.right-sidebar');
       $page = $('.page-with-sidebar');
@@ -65,9 +65,10 @@
     });
 
     it('should broadcast todo:toggle event when add todo clicked', function() {
+      var todos = getJSONFixture('todos.json');
       spyOn(jQuery, 'ajax').and.callFake(function() {
         var d = $.Deferred();
-        var response = fixture.load('todos.json');
+        var response = todos;
         d.resolve(response);
         return d.promise();
       });
diff --git a/spec/javascripts/search_autocomplete_spec.js b/spec/javascripts/search_autocomplete_spec.js
index 1b7f642d59e0af330e75fdd52c4915cd0c08b161..e13c4ad772cc40d0e33f9d91e163368bbcd1c0ce 100644
--- a/spec/javascripts/search_autocomplete_spec.js
+++ b/spec/javascripts/search_autocomplete_spec.js
@@ -112,9 +112,9 @@
   };
 
   describe('Search autocomplete dropdown', function() {
-    fixture.preload('search_autocomplete.html');
+    preloadFixtures('static/search_autocomplete.html.raw');
     beforeEach(function() {
-      fixture.load('search_autocomplete.html');
+      loadFixtures('static/search_autocomplete.html.raw');
       return widget = new gl.SearchAutocomplete;
     });
     it('should show Dashboard specific dropdown menu', function() {
diff --git a/spec/javascripts/shortcuts_issuable_spec.js b/spec/javascripts/shortcuts_issuable_spec.js
index 7bc898aed5daaae3f2db4a0992cf85ec7a75c1d8..ae5d639ad9c9cf2735fb2a3c23ddac83da40c3c8 100644
--- a/spec/javascripts/shortcuts_issuable_spec.js
+++ b/spec/javascripts/shortcuts_issuable_spec.js
@@ -6,9 +6,9 @@
 (function() {
   describe('ShortcutsIssuable', function() {
     var fixtureName = 'issues/open-issue.html.raw';
-    fixture.preload(fixtureName);
+    preloadFixtures(fixtureName);
     beforeEach(function() {
-      fixture.load(fixtureName);
+      loadFixtures(fixtureName);
       document.querySelector('.js-new-note-form').classList.add('js-main-target-form');
       return this.shortcut = new ShortcutsIssuable();
     });
diff --git a/spec/javascripts/signin_tabs_memoizer_spec.js.es6 b/spec/javascripts/signin_tabs_memoizer_spec.js.es6
index 9a9fb22255b9d7c3f52e440eb4799965d0568cdc..c274b9c45f448f29111a56a43603f9104f886f1d 100644
--- a/spec/javascripts/signin_tabs_memoizer_spec.js.es6
+++ b/spec/javascripts/signin_tabs_memoizer_spec.js.es6
@@ -2,7 +2,7 @@
 
 ((global) => {
   describe('SigninTabsMemoizer', () => {
-    const fixtureTemplate = 'signin_tabs.html';
+    const fixtureTemplate = 'static/signin_tabs.html.raw';
     const tabSelector = 'ul.nav-tabs';
     const currentTabKey = 'current_signin_tab';
     let memo;
@@ -15,10 +15,10 @@
       return memo;
     }
 
-    fixture.preload(fixtureTemplate);
+    preloadFixtures(fixtureTemplate);
 
     beforeEach(() => {
-      fixture.load(fixtureTemplate);
+      loadFixtures(fixtureTemplate);
     });
 
     it('does nothing if no tab was previously selected', () => {
diff --git a/spec/javascripts/smart_interval_spec.js.es6 b/spec/javascripts/smart_interval_spec.js.es6
index 1b7ca97cde48c6e071e012c5b40a0e76f3465c76..39d236986b982ae194843be373e927a16e687087 100644
--- a/spec/javascripts/smart_interval_spec.js.es6
+++ b/spec/javascripts/smart_interval_spec.js.es6
@@ -103,7 +103,7 @@
     describe('DOM Events', function () {
       beforeEach(function () {
         // This ensures DOM and DOM events are initialized for these specs.
-        fixture.set('<div></div>');
+        setFixtures('<div></div>');
 
         this.smartInterval = createDefaultSmartInterval();
       });
diff --git a/spec/javascripts/spec_helper.js b/spec/javascripts/spec_helper.js
index 831dfada95224abb52880d14d150a352e50ff915..f8e3aca29fa5269614e5d704c030890d16806961 100644
--- a/spec/javascripts/spec_helper.js
+++ b/spec/javascripts/spec_helper.js
@@ -37,12 +37,12 @@
 // file as a manifest.
 // For more information: http://github.com/modeset/teaspoon
 
-(function() {
-
-
-}).call(this);
+// set our fixtures path
+jasmine.getFixtures().fixturesPath = '/teaspoon/fixtures';
+jasmine.getJSONFixtures().fixturesPath = '/teaspoon/fixtures';
 
 // defined in ActionDispatch::TestRequest
 // see https://github.com/rails/rails/blob/v4.2.7.1/actionpack/lib/action_dispatch/testing/test_request.rb#L7
 window.gl = window.gl || {};
-gl.TEST_HOST = 'http://test.host';
+window.gl.TEST_HOST = 'http://test.host';
+window.gon = window.gon || {};
diff --git a/spec/javascripts/syntax_highlight_spec.js b/spec/javascripts/syntax_highlight_spec.js
index ac411f6c3060801fbd6efbf92886845c46304d69..5984ce8ffd4e1be190e049b997a69ca23b99ee44 100644
--- a/spec/javascripts/syntax_highlight_spec.js
+++ b/spec/javascripts/syntax_highlight_spec.js
@@ -13,7 +13,7 @@
     };
     describe('on a js-syntax-highlight element', function() {
       beforeEach(function() {
-        return fixture.set('<div class="js-syntax-highlight"></div>');
+        return setFixtures('<div class="js-syntax-highlight"></div>');
       });
       return it('applies syntax highlighting', function() {
         stubUserColorScheme('monokai');
@@ -23,7 +23,7 @@
     });
     return describe('on a parent element', function() {
       beforeEach(function() {
-        return fixture.set("<div class=\"parent\">\n  <div class=\"js-syntax-highlight\"></div>\n  <div class=\"foo\"></div>\n  <div class=\"js-syntax-highlight\"></div>\n</div>");
+        return setFixtures("<div class=\"parent\">\n  <div class=\"js-syntax-highlight\"></div>\n  <div class=\"foo\"></div>\n  <div class=\"js-syntax-highlight\"></div>\n</div>");
       });
       it('applies highlighting to all applicable children', function() {
         stubUserColorScheme('monokai');
@@ -33,7 +33,7 @@
       });
       return it('prevents an infinite loop when no matches exist', function() {
         var highlight;
-        fixture.set('<div></div>');
+        setFixtures('<div></div>');
         highlight = function() {
           return $('div').syntaxHighlight();
         };
diff --git a/spec/javascripts/u2f/authenticate_spec.js b/spec/javascripts/u2f/authenticate_spec.js
index f6399b2286572f90c98056ec15a6c7c267bf0e21..dc2f49679853502412c1346c3b677d9eb703bb9a 100644
--- a/spec/javascripts/u2f/authenticate_spec.js
+++ b/spec/javascripts/u2f/authenticate_spec.js
@@ -10,10 +10,10 @@
 
 (function() {
   describe('U2FAuthenticate', function() {
-    fixture.preload('u2f/authenticate.html.raw');
+    preloadFixtures('u2f/authenticate.html.raw');
 
     beforeEach(function() {
-      fixture.load('u2f/authenticate.html.raw');
+      loadFixtures('u2f/authenticate.html.raw');
       this.u2fDevice = new MockU2FDevice;
       this.container = $("#js-authenticate-u2f");
       this.component = new window.gl.U2FAuthenticate(
diff --git a/spec/javascripts/u2f/register_spec.js b/spec/javascripts/u2f/register_spec.js
index 7eda2ac4c249bbf703a861464fe4a541d513a9d3..ab4c5edd044b4fd9baa185c43c8df76f37a62af9 100644
--- a/spec/javascripts/u2f/register_spec.js
+++ b/spec/javascripts/u2f/register_spec.js
@@ -10,10 +10,10 @@
 
 (function() {
   describe('U2FRegister', function() {
-    fixture.preload('u2f/register.html.raw');
+    preloadFixtures('u2f/register.html.raw');
 
     beforeEach(function() {
-      fixture.load('u2f/register.html.raw');
+      loadFixtures('u2f/register.html.raw');
       this.u2fDevice = new MockU2FDevice;
       this.container = $("#js-register-u2f");
       this.component = new U2FRegister(this.container, $("#js-register-u2f-templates"), {}, "token");
diff --git a/spec/javascripts/vue_common_components/commit_spec.js.es6 b/spec/javascripts/vue_common_components/commit_spec.js.es6
index 26dfdb94aae490a2d6ba17d4e62b1b636270eb75..d6c6f786fb16b9ccacdd52b8deed51a631ce8ad2 100644
--- a/spec/javascripts/vue_common_components/commit_spec.js.es6
+++ b/spec/javascripts/vue_common_components/commit_spec.js.es6
@@ -5,7 +5,7 @@ describe('Commit component', () => {
   let component;
 
   it('should render a code-fork icon if it does not represent a tag', () => {
-    fixture.set('<div class="test-commit-container"></div>');
+    setFixtures('<div class="test-commit-container"></div>');
     component = new window.gl.CommitComponent({
       el: document.querySelector('.test-commit-container'),
       propsData: {
@@ -30,7 +30,7 @@ describe('Commit component', () => {
 
   describe('Given all the props', () => {
     beforeEach(() => {
-      fixture.set('<div class="test-commit-container"></div>');
+      setFixtures('<div class="test-commit-container"></div>');
 
       props = {
         tag: true,
@@ -105,7 +105,7 @@ describe('Commit component', () => {
 
   describe('When commit title is not provided', () => {
     it('should render default message', () => {
-      fixture.set('<div class="test-commit-container"></div>');
+      setFixtures('<div class="test-commit-container"></div>');
       props = {
         tag: false,
         commitRef: {
diff --git a/spec/javascripts/zen_mode_spec.js b/spec/javascripts/zen_mode_spec.js
index 5b4d007c8f7363b7f555d83520f59cceb544ed9c..f1c2edcc55c09121d9a507013105d0c5ad62e14a 100644
--- a/spec/javascripts/zen_mode_spec.js
+++ b/spec/javascripts/zen_mode_spec.js
@@ -10,9 +10,9 @@
 
   describe('ZenMode', function() {
     var fixtureName = 'issues/open-issue.html.raw';
-    fixture.preload(fixtureName);
+    preloadFixtures(fixtureName);
     beforeEach(function() {
-      fixture.load(fixtureName);
+      loadFixtures(fixtureName);
       spyOn(Dropzone, 'forElement').and.callFake(function() {
         return {
           enable: function() {
diff --git a/spec/support/javascript_fixtures_helpers.rb b/spec/support/javascript_fixtures_helpers.rb
index d15aac61b18fd99dfa724626f020a038b3de8972..0b8729db0f9e8a3fab4b4a839c7ba5e442398e0b 100644
--- a/spec/support/javascript_fixtures_helpers.rb
+++ b/spec/support/javascript_fixtures_helpers.rb
@@ -20,11 +20,24 @@ def clean_frontend_fixtures(directory_name)
 
   # Public: Store a response object as fixture file
   #
-  # response - response object to store
+  # response - string or response object to store
   # fixture_file_name - file name to store the fixture in (relative to FIXTURE_PATH)
   #
   def store_frontend_fixture(response, fixture_file_name)
     fixture_file_name = File.expand_path(fixture_file_name, FIXTURE_PATH)
+    fixture = response.respond_to?(:body) ? parse_response(response) : response
+
+    FileUtils.mkdir_p(File.dirname(fixture_file_name))
+    File.write(fixture_file_name, fixture)
+  end
+
+  private
+
+  # Private: Prepare a response object for use as a frontend fixture
+  #
+  # response - response object to prepare
+  #
+  def parse_response(response)
     fixture = response.body
     fixture.force_encoding("utf-8")
 
@@ -45,7 +58,6 @@ def store_frontend_fixture(response, fixture_file_name)
       fixture.gsub!(%r{="/}, "=\"http://#{test_host}/")
     end
 
-    FileUtils.mkdir_p(File.dirname(fixture_file_name))
-    File.write(fixture_file_name, fixture)
+    fixture
   end
 end