diff --git a/js/src/dom/selectorEngine.js b/js/src/dom/selectorEngine.js
index b6b45bacb4d4895608de359a5197e252f29b8534..55d2ce4bbc017272d93cc1614b76082b79017b19 100644
--- a/js/src/dom/selectorEngine.js
+++ b/js/src/dom/selectorEngine.js
@@ -3,7 +3,7 @@ import Util from '../util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-beta): dom/selectorEngine.js
+ * Bootstrap (v4.1.1): dom/selectorEngine.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -69,6 +69,10 @@ const SelectorEngine = (() => {
     },
 
     closest(element, selector) {
+      if (typeof selector !== 'string') {
+        return null
+      }
+
       return closest(element, selector)
     },
 
diff --git a/js/tests/index.html b/js/tests/index.html
index f4a99df44e5707c910c6573ef89612c9d78a3cf9..d0ff5b82b62ea2b3762dab1fe86adffa9aa53003 100644
--- a/js/tests/index.html
+++ b/js/tests/index.html
@@ -119,6 +119,7 @@
     <script src="unit/dom/eventHandler.js"></script>
     <script src="unit/dom/manipulator.js"></script>
     <script src="unit/dom/data.js"></script>
+    <script src="unit/dom/selectorEngine.js"></script>
     <script src="unit/alert.js"></script>
     <script src="unit/button.js"></script>
     <script src="unit/carousel.js"></script>
diff --git a/js/tests/unit/.eslintrc.json b/js/tests/unit/.eslintrc.json
index 4010b98305ff0dddf9a4f07368d609a30e50475e..dfcf1eaa50034e31c3aa05a7c4ad13f9310aede3 100644
--- a/js/tests/unit/.eslintrc.json
+++ b/js/tests/unit/.eslintrc.json
@@ -15,7 +15,8 @@
     "Simulator": false,
     "Toast": false,
     "EventHandler": false,
-    "Manipulator": false
+    "Manipulator": false,
+    "SelectorEngine": false
   },
   "parserOptions": {
     "ecmaVersion": 5,
diff --git a/js/tests/unit/dom/eventHandler.js b/js/tests/unit/dom/eventHandler.js
index f28261632834bf7d4364d57221b785f5f76feb24..076a28a8a13be9b797828828d5fa98d24afd462a 100644
--- a/js/tests/unit/dom/eventHandler.js
+++ b/js/tests/unit/dom/eventHandler.js
@@ -1,7 +1,7 @@
 $(function () {
   'use strict'
 
-  QUnit.module('event handler')
+  QUnit.module('eventHandler')
 
   QUnit.test('should be defined', function (assert) {
     assert.expect(1)
diff --git a/js/tests/unit/dom/selectorEngine.js b/js/tests/unit/dom/selectorEngine.js
new file mode 100644
index 0000000000000000000000000000000000000000..80bee7800e5a784be72db475d49f540d3eb0af9b
--- /dev/null
+++ b/js/tests/unit/dom/selectorEngine.js
@@ -0,0 +1,77 @@
+$(function () {
+  'use strict'
+
+  QUnit.module('selectorEngine')
+
+  QUnit.test('should be defined', function (assert) {
+    assert.expect(1)
+    assert.ok(SelectorEngine, 'Manipulator is defined')
+  })
+
+  QUnit.test('should determine if an element match the selector', function (assert) {
+    assert.expect(2)
+    $('<input type="checkbox" /> <button class="btn"></button>').appendTo('#qunit-fixture')
+
+    assert.ok(!SelectorEngine.matches($('#qunit-fixture')[0], '.btn'))
+    assert.ok(SelectorEngine.matches($('.btn')[0], '.btn'))
+  })
+
+  QUnit.test('should find the selector, according to an element or not', function (assert) {
+    assert.expect(3)
+    $('<input type="checkbox" /> <button class="btn"></button>').appendTo('#qunit-fixture')
+
+    var btn = $('.btn').first()[0]
+    assert.strictEqual(SelectorEngine.find($('.btn')), null)
+    assert.equal(SelectorEngine.find('.btn')[0], btn)
+    assert.equal(SelectorEngine.find('.btn', $('#qunit-fixture')[0])[0], btn)
+  })
+
+  QUnit.test('should find the first element which match the selector, according to an element or not', function (assert) {
+    assert.expect(3)
+    $('<button class="btn">btn1</button> <button class="btn">btn2</button>').appendTo('#qunit-fixture')
+
+    var btn = $('.btn').first()[0]
+    assert.strictEqual(SelectorEngine.findOne($('.btn')), null)
+    assert.equal(SelectorEngine.findOne('.btn'), btn)
+    assert.equal(SelectorEngine.findOne('.btn', $('#qunit-fixture')[0]), btn)
+  })
+
+  QUnit.test('should find children', function (assert) {
+    assert.expect(2)
+    $('<button class="btn">btn1</button> <button class="btn">btn2</button> <input type="text" />').appendTo('#qunit-fixture')
+
+    assert.strictEqual(SelectorEngine.children($('.btn')), null)
+    assert.equal(SelectorEngine.children($('#qunit-fixture')[0], '.btn').length, 2)
+  })
+
+  QUnit.test('should find the selector in parents', function (assert) {
+    assert.expect(2)
+
+    $('<input type="text" />').appendTo('#qunit-fixture')
+    assert.strictEqual(SelectorEngine.parents($('.container')[0], {}), null)
+    assert.strictEqual(SelectorEngine.parents($('input')[0], 'body').length, 1)
+  })
+
+  QUnit.test('should find the closest element according to the selector', function (assert) {
+    assert.expect(2)
+    var html =
+      '<div class="test">' +
+      '  <button class="btn"></button>' +
+      '</div>'
+
+    $(html).appendTo('#qunit-fixture')
+    assert.strictEqual(SelectorEngine.closest($('.btn')[0], {}), null)
+    assert.strictEqual(SelectorEngine.closest($('.btn')[0], '.test'), $('.test')[0])
+  })
+
+  QUnit.test('should fin previous element', function (assert) {
+    assert.expect(2)
+    var html =
+      '<div class="test"></div>' +
+      '<button class="btn"></button>'
+
+    $(html).appendTo('#qunit-fixture')
+    assert.strictEqual(SelectorEngine.prev($('.btn')[0], {}), null)
+    assert.strictEqual(SelectorEngine.prev($('.btn')[0], '.test')[0], $('.test')[0])
+  })
+})