diff --git a/test/harness/assert.js b/test/harness/assert.js
index 1d9d4a48f22903be816e05fba896b8a07dcb3555..2c1c884a3815496847173c821a7ee92f9303ffd2 100644
--- a/test/harness/assert.js
+++ b/test/harness/assert.js
@@ -40,3 +40,25 @@ assert.notSameValue = function (actual, unexpected, message) {
     }
     $ERROR(message);
 };
+
+assert.throws = function (expectedErrorConstructor, func) {
+    if (func === undefined) {
+        $ERROR('assert.throws requires two arguments: the error constructor and a function to run');
+        return;
+    }
+
+    try {
+        func();
+    } catch (thrown) {
+        if (typeof thrown !== 'object' || thrown === null) {
+            $ERROR('Thrown value was not an object!');
+            return;
+        }
+        if (thrown.constructor !== expectedErrorConstructor) {
+            $ERROR('Expected a ' + expectedErrorConstructor.name + ' but got a ' + thrown.constructor.name);
+        }
+        return;
+    }
+
+    $ERROR('Expected a ' + expectedErrorConstructor.name + ' to be thrown but no exception was thrown at all');
+};