diff --git a/test/unit.html b/test/unit.html
index 601820c..5cb61cf 100644
--- a/test/unit.html
+++ b/test/unit.html
@@ -58,6 +58,7 @@
     <div id="mock"></div>
 
     <script type="text/javascript">
+      teardown(function() { $('#mock').empty(); });
       var runner = mocha.run();
 
       if (post_xunit_to) {
diff --git a/test/unit/SupSub.test.js b/test/unit/SupSub.test.js
index 1602d6f..45d5a23 100644
--- a/test/unit/SupSub.test.js
+++ b/test/unit/SupSub.test.js
@@ -3,9 +3,6 @@
   setup(function() {
     mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
   });
-  teardown(function() {
-    $(mq.el()).remove();
-  });
 
   function prayWellFormedPoint(pt) { prayWellFormed(pt.parent, pt[L], pt[R]); }
 
diff --git a/test/unit/autoOperatorNames.test.js b/test/unit/autoOperatorNames.test.js
index eb7c21c..0199ce8 100644
--- a/test/unit/autoOperatorNames.test.js
+++ b/test/unit/autoOperatorNames.test.js
@@ -3,9 +3,6 @@
   setup(function() {
     mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
   });
-  teardown(function() {
-    $(mq.el()).remove();
-  });
 
   function assertLatex(input, expected) {
     var result = mq.latex();
diff --git a/test/unit/autosubscript.test.js b/test/unit/autosubscript.test.js
index a085ccc..3680d31 100644
--- a/test/unit/autosubscript.test.js
+++ b/test/unit/autosubscript.test.js
@@ -6,9 +6,6 @@
     controller = mq.__controller;
     cursor = controller.cursor;
   });
-  teardown(function() {
-    $(mq.el()).remove();
-  });
 
   test('auto subscripting variables', function() {
     mq.latex('x');
diff --git a/test/unit/backspace.test.js b/test/unit/backspace.test.js
index 688d1ba..b76ec52 100644
--- a/test/unit/backspace.test.js
+++ b/test/unit/backspace.test.js
@@ -6,9 +6,6 @@
     controller = mq.__controller;
     cursor = controller.cursor;
   });
-  teardown(function() {
-    $(mq.el()).remove();
-  });
 
   function prayWellFormedPoint(pt) { prayWellFormed(pt.parent, pt[L], pt[R]); }
   function assertLatex(latex) {
diff --git a/test/unit/css.test.js b/test/unit/css.test.js
index 56e12d2..4388df6 100644
--- a/test/unit/css.test.js
+++ b/test/unit/css.test.js
@@ -12,7 +12,6 @@
     assert.equal(mock.scrollHeight, 25);
     assert.equal(mock.scrollWidth, 25);
 
-    $(mq.el()).remove();
     $(mock).css({
       fontSize: '',
       height: '',
@@ -27,8 +26,6 @@
 
     assert.ok(rootEl.hasClass('mq-empty'), 'Empty root block should have the mq-empty class name.');
     assert.ok(rootEl.height() > 0, 'Empty root block height should be above 0.');
-
-    testEl.remove();
   });
 
   test('empty block does not collapse', function() {
@@ -38,8 +35,6 @@
 
     assert.ok(numeratorEl.hasClass('mq-empty'), 'Empty numerator should have the mq-empty class name.');
     assert.ok(numeratorEl.height() > 0, 'Empty numerator height should be above 0.');
-
-    testEl.remove();
   });
 
   test('test florin spacing', function () {
@@ -52,8 +47,6 @@
     var mqF = $(mq.el()).find('.mq-f');
     var testVal = parseFloat(mqF.css('margin-right')) - parseFloat(mqF.css('margin-left'));
     assert.ok(testVal > 0, 'this should be truthy') ;
-
-    $(mq.el()).remove();
   });
 
   test('unary PlusMinus before separator', function () {
@@ -78,8 +71,6 @@
     assertUnaryOperator(28, '(-1,-1-1)-1,(+1;+1+1)+1,(\pm1,\pm');
     assertBinaryOperator(30, '(-1,-1-1)-1,(+1;+1+1)+1,(\pm1,\pm1\pm');
     assertBinaryOperator(33, '(-1,-1-1)-1,(+1;+1+1)+1,(\pm1,\pm1\pm1)\pm');
-
-    $(mq.el()).remove();
   });
 
   test('proper unary/binary within style block', function () {
@@ -109,8 +100,6 @@
 
     assertUnaryOperator(2, '\\textcolor{red}{\\class{dummy}{-}}');
     assertBinaryOperator(6, '\\textcolor{red}{\\class{dummy}{-}}2\\textcolor{green}{\\class{dummy}{+}}');
-
-    $(mq.el()).remove();
   });
 
   test('operator name spacing e.g. sin x', function() {
diff --git a/test/unit/focusBlur.test.js b/test/unit/focusBlur.test.js
index 20b4fbd..8fb1b86 100644
--- a/test/unit/focusBlur.test.js
+++ b/test/unit/focusBlur.test.js
@@ -17,9 +17,6 @@
       mq2 = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
       wasUpOutOfCalled = false;
     });
-    teardown(function() {
-      $(mq.el()).add(mq2.el()).remove();
-    });
 
     function triggerUpOutOf(mq) {
       $(mq.el()).find('textarea').trigger(jQuery.Event('keydown', { which: 38 }));
@@ -76,8 +73,6 @@
         mq.keystroke('Shift-Left');
         setTimeout(function() {
           assert.equal($(mq.el()).find('textarea').val(), 'd');
-
-          $(mq.el()).remove();
           done();
         });
       }, 100);
diff --git a/test/unit/latex.test.js b/test/unit/latex.test.js
index ab6d925..5801112 100644
--- a/test/unit/latex.test.js
+++ b/test/unit/latex.test.js
@@ -133,9 +133,6 @@
     setup(function() {
       mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
     });
-    teardown(function() {
-      $(mq.el()).remove();
-    });
 
     suite('.latex(...)', function() {
       function assertParsesLatex(str, latex) {
@@ -251,9 +248,6 @@
       inner1 = outer.innerFields[0];
       inner2 = outer.innerFields[1];
     });
-    teardown(function() {
-      $(outer.el()).remove();
-    });
 
     test('initial latex', function() {
       assert.equal(inner1.latex(), 'x_0+x_1+x_2');
@@ -308,9 +302,6 @@
     setup(function() {
       mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
     });
-    teardown(function() {
-      $(mq.el()).remove();
-    });
 
     function testCantParse(title /*, latex...*/) {
       var latex = [].slice.call(arguments, 1);
diff --git a/test/unit/publicapi.test.js b/test/unit/publicapi.test.js
index e4fff58..f3d621d 100644
--- a/test/unit/publicapi.test.js
+++ b/test/unit/publicapi.test.js
@@ -56,9 +56,6 @@
     setup(function() {
       mq = MQBasic.MathField($('<span></span>').appendTo('#mock')[0]);
     });
-    teardown(function() {
-      $(mq.el()).remove();
-    });
 
     test('typing \\', function() {
       mq.typedText('\\');
@@ -81,9 +78,6 @@
     setup(function() {
       mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
     });
-    teardown(function() {
-      $(mq.el()).remove();
-    });
 
     test('.revert()', function() {
       var mq = MQ.MathField($('<span>some <code>HTML</code></span>')[0]);
@@ -333,9 +327,6 @@
     setup(function() {
       mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
     });
-    teardown(function() {
-      $(mq.el()).remove();
-    });
 
     test('basic', function() {
       mq.cmd('x');
@@ -421,8 +412,6 @@
       mq.typedText(' ');
       assert.equal(cursor[L].ctrlSeq, '\\ ', 'left of the cursor is ' + cursor[L].ctrlSeq);
       assert.equal(cursor[R], 0, 'right of the cursor is ' + cursor[R]);
-
-      $(mq.el()).remove();
     });
     test('space behaves like tab when spaceBehavesLikeTab is true', function() {
       var opts = { 'spaceBehavesLikeTab': true };
@@ -441,8 +430,6 @@
       mq.keystroke('Shift-Spacebar');
       assert.equal(cursor[L], 0, 'left cursor is ' + cursor[L]);
       assert.equal(cursor[R], rootBlock.ends[L], 'parent of rootBlock is ' + cursor[R]);
-
-      $(mq.el()).remove();
     });
     test('space behaves like tab when globally set to true', function() {
       MQ.config({ spaceBehavesLikeTab: true });
@@ -457,8 +444,6 @@
       mq.keystroke('Spacebar');
       assert.equal(cursor.parent, rootBlock, 'cursor in root block');
       assert.equal(cursor[R], 0, 'cursor at end of block');
-
-      $(mq.el()).remove();
     });
   });
 
@@ -469,9 +454,6 @@
         mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
         textarea = $(mq.el()).find('textarea');;
       });
-      teardown(function() {
-        $(mq.el()).remove();
-      });
       function assertPaste(paste, latex) {
         if (arguments.length < 2) latex = paste;
         mq.latex('');
@@ -513,9 +495,6 @@
                                  { statelessClipboard: true });
         textarea = $(mq.el()).find('textarea');;
       });
-      teardown(function() {
-        $(mq.el()).remove();
-      });
       function assertPaste(paste, latex) {
         if (arguments.length < 2) latex = paste;
         mq.latex('');
@@ -564,9 +543,6 @@
       setup(function() {
         mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
       });
-      teardown(function() {
-        $(mq.el()).remove();
-      });
 
       test('fractions', function() {
         mq.latex('\\frac{1}{x}+\\frac{\\frac{1}{2}}{\\frac{3}{4}}');
@@ -665,9 +641,6 @@
         mq = MQ.MathField($('<span></span>').appendTo('#mock')[0],
                                  { leftRightIntoCmdGoes: 'up' });
       });
-      teardown(function() {
-        $(mq.el()).remove();
-      });
 
       test('fractions', function() {
         mq.latex('\\frac{1}{x}+\\frac{\\frac{1}{2}}{\\frac{3}{4}}');
@@ -750,8 +723,6 @@
 
       mq.cmd('n');
       assert.equal(mq.latex(), '\\sum_n^{ }', 'cursor in lower limit');
-
-      $(mq.el()).remove();
     });
     test('sum starts with `n=`', function() {
       var mq = MQ.MathField($('<span>').appendTo('#mock')[0], {
@@ -764,8 +735,6 @@
 
       mq.cmd('0');
       assert.equal(mq.latex(), '\\sum_{n=0}^{ }', 'cursor after the `n=`');
-
-      $(mq.el()).remove();
     });
     test('integral still has empty limits', function() {
       var mq = MQ.MathField($('<span>').appendTo('#mock')[0], {
@@ -778,8 +747,6 @@
 
       mq.cmd('0');
       assert.equal(mq.latex(), '\\int_0^{ }', 'cursor in the from block');
-
-      $(mq.el()).remove();
     });
   });
 
@@ -794,8 +761,6 @@
       assert.equal(mq.latex(), '');
       mq.write('asdf');
       mq.select();
-
-      $(mq.el()).remove();
     });
   });
 
@@ -815,8 +780,6 @@
 
       $(mq.el()).find('textarea').trigger({ type: 'keydown', which: '37' });
       assert.equal(key, 'Left');
-
-      $(mq.el()).remove();
     });
     test('cut is async', function() {
       var mq = MQ.MathField($('<span>').appendTo('#mock')[0], {
@@ -839,8 +802,6 @@
 
       $(mq.el()).find('textarea').trigger('keyup');
       assert.equal(count, 1);
-
-      $(mq.el()).remove();
     });
   });
 
@@ -868,7 +829,6 @@
       assert.equal(mq.latex(), "\\frac{mmmm}{mmxmm}");
 
       filler.remove();
-      $(mq.el()).remove();
     });
     test('target is optional', function() {
       // Insert filler so that the page is taller than the window so this test is deterministic
@@ -892,7 +852,6 @@
       assert.equal(mq.latex(), "\\frac{mmmm}{mmxmm}");
 
       filler.remove();
-      $(mq.el()).remove();
     });
   });
 
@@ -908,8 +867,6 @@
       assert.ok(jQuery('.embedded-html').length);
       assert.equal(mq.text(), "embedded text");
       assert.equal(mq.latex(), "embedded latex");
-
-      $(mq.el()).remove();
     });
     test('inserts at coordinates', function() {
       // Insert filler so that the page is taller than the window so this test is deterministic
@@ -937,7 +894,6 @@
       assert.equal(mq.latex(), "\\frac{mmmm}{mmembedded latexmm}");
 
       filler.remove();
-      $(mq.el()).remove();
     });
   });
 
@@ -967,7 +923,5 @@
     assert.ok(jQuery('.embedded-html').length);
     assert.equal(mq.text(), "sqrt(embedded text)");
     assert.equal(mq.latex(), "\\sqrt{embedded latex}");
-
-    $(mq.el()).remove();
   });
 });
diff --git a/test/unit/saneKeyboardEvents.test.js b/test/unit/saneKeyboardEvents.test.js
index fe59265..41284ea 100644
--- a/test/unit/saneKeyboardEvents.test.js
+++ b/test/unit/saneKeyboardEvents.test.js
@@ -10,10 +10,6 @@
     el = $('<textarea>').appendTo('#mock');
   });
 
-  teardown(function() {
-    el.remove();
-  });
-
   test('normal keys', function(done) {
     var counter = 0;
     saneKeyboardEvents(el, {
diff --git a/test/unit/text.test.js b/test/unit/text.test.js
index 982a5ac..11b2617 100644
--- a/test/unit/text.test.js
+++ b/test/unit/text.test.js
@@ -71,21 +71,17 @@
     var controller = mq.__controller;
     var cursor = controller.cursor;
 
-    try {
-      mq.latex('\\text{x}');
+    mq.latex('\\text{x}');
 
-      mq.keystroke('Left');
-      assertSplit(cursor.jQ, 'x');
+    mq.keystroke('Left');
+    assertSplit(cursor.jQ, 'x');
 
-      mq.keystroke('Backspace');
-      assertSplit(cursor.jQ);
+    mq.keystroke('Backspace');
+    assertSplit(cursor.jQ);
 
-      mq.keystroke('Right');
-      assertSplit(cursor.jQ);
-      assert.equal(cursor[L], 0);
-    } finally {
-      $(mq.el()).remove();
-    }
+    mq.keystroke('Right');
+    assertSplit(cursor.jQ);
+    assert.equal(cursor[L], 0);
   });
 
   test('typing $ in a textblock splits it', function() {
@@ -93,15 +89,11 @@
     var controller = mq.__controller;
     var cursor = controller.cursor;
 
-    try {
-      mq.latex('\\text{asdf}');
-      mq.keystroke('Left Left Left');
-      assertSplit(cursor.jQ, 'as', 'df');
+    mq.latex('\\text{asdf}');
+    mq.keystroke('Left Left Left');
+    assertSplit(cursor.jQ, 'as', 'df');
 
-      mq.typedText('$');
-      assert.equal(mq.latex(), '\\text{as}\\text{df}');
-    } finally {
-      $(mq.el()).remove();
-    }
+    mq.typedText('$');
+    assert.equal(mq.latex(), '\\text{as}\\text{df}');
   });
 });
diff --git a/test/unit/typing.test.js b/test/unit/typing.test.js
index 578af1f..f3c30fe 100644
--- a/test/unit/typing.test.js
+++ b/test/unit/typing.test.js
@@ -3,9 +3,6 @@
   setup(function() {
     mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]);
   });
-  teardown(function() {
-    $(mq.el()).remove();
-  });
 
   function prayWellFormedPoint(pt) { prayWellFormed(pt.parent, pt[L], pt[R]); }
   function assertLatex(latex) {
@@ -27,7 +24,6 @@
       var mq_basic = MQBasic.MathField($('<span></span>').appendTo('#mock')[0]);
       mq_basic.typedText('1/2');
       assert.equal(mq_basic.latex(), '\\frac{1}{2}');
-      $(mq_basic.el()).remove();
     });
   });
 
diff --git a/test/unit/updown.test.js b/test/unit/updown.test.js
index 667e1a6..783036a 100644
--- a/test/unit/updown.test.js
+++ b/test/unit/updown.test.js
@@ -6,9 +6,6 @@
     controller = mq.__controller;
     cursor = controller.cursor;
   });
-  teardown(function() {
-    $(mq.el()).remove();
-  });
 
   test('up/down in out of exponent', function() {
     controller.renderLatexMath('x^{nm}');
@@ -183,7 +180,5 @@
     assert.equal(inner.__controller.cursor.parent, inner.__controller.root);
     inner.keystroke('Down');
     assert.equal(inner.__controller.cursor.parent, inner.__controller.root);
-
-    $(outer.el()).remove();
   });
 });
