diff --git a/spec/javascripts/.eslintrc b/spec/javascripts/.eslintrc
index dcbcd014dc3c2730c05f4e411268e0872d18ee12..3cd419b37c9c7893bac30b00184a75178b94ef47 100644
--- a/spec/javascripts/.eslintrc
+++ b/spec/javascripts/.eslintrc
@@ -23,6 +23,8 @@
   "plugins": ["jasmine"],
   "rules": {
     "prefer-arrow-callback": 0,
-    "func-names": 0
+    "func-names": 0,
+    "jasmine/no-suite-dupes": [1, "branch"],
+    "jasmine/no-spec-dupes": [1, "branch"]
   }
 }
diff --git a/spec/javascripts/helpers/class_spec_helper.js.es6 b/spec/javascripts/helpers/class_spec_helper.js.es6
new file mode 100644
index 0000000000000000000000000000000000000000..92a20687ec5974e91011dac46ae88e2ee93e8de8
--- /dev/null
+++ b/spec/javascripts/helpers/class_spec_helper.js.es6
@@ -0,0 +1,9 @@
+/* eslint-disable no-unused-vars */
+
+class ClassSpecHelper {
+  static itShouldBeAStaticMethod(base, method) {
+    return it('should be a static method', () => {
+      expect(Object.prototype.hasOwnProperty.call(base, method)).toBeTruthy();
+    });
+  }
+}
diff --git a/spec/javascripts/helpers/class_spec_helper_spec.js.es6 b/spec/javascripts/helpers/class_spec_helper_spec.js.es6
new file mode 100644
index 0000000000000000000000000000000000000000..d1155f1bd1edd0cd0db59b4b1ea5c895f01b20ba
--- /dev/null
+++ b/spec/javascripts/helpers/class_spec_helper_spec.js.es6
@@ -0,0 +1,35 @@
+/* global ClassSpecHelper */
+//= require ./class_spec_helper
+
+describe('ClassSpecHelper', () => {
+  describe('.itShouldBeAStaticMethod', function () {
+    beforeEach(() => {
+      class TestClass {
+        instanceMethod() { this.prop = 'val'; }
+        static staticMethod() {}
+      }
+
+      this.TestClass = TestClass;
+    });
+
+    ClassSpecHelper.itShouldBeAStaticMethod(ClassSpecHelper, 'itShouldBeAStaticMethod');
+
+    it('should have a defined spec', () => {
+      expect(ClassSpecHelper.itShouldBeAStaticMethod(this.TestClass, 'staticMethod').description).toBe('should be a static method');
+    });
+
+    it('should pass for a static method', () => {
+      const spec = ClassSpecHelper.itShouldBeAStaticMethod(this.TestClass, 'staticMethod');
+      expect(spec.status()).toBe('passed');
+    });
+
+    it('should fail for an instance method', (done) => {
+      const spec = ClassSpecHelper.itShouldBeAStaticMethod(this.TestClass, 'instanceMethod');
+      spec.resultCallback = (result) => {
+        expect(result.status).toBe('failed');
+        done();
+      };
+      spec.execute();
+    });
+  });
+});
diff --git a/spec/teaspoon_env.rb b/spec/teaspoon_env.rb
index 5ea020f313c9afeb57f426ed0d0f90655a8d165b..643b161cdf46d68f9f95f9ee3d0429151c30083a 100644
--- a/spec/teaspoon_env.rb
+++ b/spec/teaspoon_env.rb
@@ -166,7 +166,7 @@ Teaspoon.configure do |config|
 
     # Assets to be ignored when generating coverage reports. Accepts an array of filenames or regular expressions. The
     # default excludes assets from vendor, gems and support libraries.
-    coverage.ignore = [%r{vendor/}, %r{spec/}]
+    coverage.ignore = [%r{vendor/}, %r{spec/javascripts/(?!helpers/)}]
 
     # Various thresholds requirements can be defined, and those thresholds will be checked at the end of a run. If any
     # aren't met the run will fail with a message. Thresholds can be defined as a percentage (0-100), or nil.