diff --git a/Gruntfile.js b/Gruntfile.js
index b66631ec0f271f02e6fa9722359bd59610897659..0ae1f95c8290631b532f1576c0262abd2aa65ae4 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -18,6 +18,9 @@ module.exports = function (grunt) {
 		eslint: {
 			target: ["src/*.js"]
 		},
+		nodeunit : {
+			all : ["test/*_test.js"]
+		},
 		watch : {
 			js : {
 				files : ["src/*.js"],
@@ -31,12 +34,13 @@ module.exports = function (grunt) {
 	});
 
 	// tasks
+	grunt.loadNpmTasks("grunt-contrib-nodeunit");
 	grunt.loadNpmTasks("grunt-contrib-watch");
 	grunt.loadNpmTasks("grunt-babel");
 	grunt.loadNpmTasks("grunt-eslint");
 
 	// aliases
-	grunt.registerTask("test", ["eslint"]);
+	grunt.registerTask("test", ["eslint", "nodeunit"]);
 	grunt.registerTask("build", ["babel"]);
 	grunt.registerTask("default", ["build", "test"]);
 };
diff --git a/lib/worker.js b/lib/worker.js
index 40478fceebfde7c0ae7acb10f30756a5dec92e03..4ee31f68b894e12ba15ebe2f8dd9426a7ea6be31 100644
--- a/lib/worker.js
+++ b/lib/worker.js
@@ -26,6 +26,9 @@ process.once("message", function (obj) {
 	    sexp = undefined;
 
 	global.self = {
+		close: function close() {
+			process.exit(0);
+		},
 		postMessage: function postMessage(msg) {
 			process.send(JSON.stringify({ data: msg }));
 		},
diff --git a/package.json b/package.json
index 66f96a8238214a8a9d4093253139d3ed86b88fc3..27c2a532111919eefc8e06b902c2d02031d0bccb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "tiny-worker",
-  "version": "1.0.3",
+  "version": "1.0.4",
   "description": "Tiny WebWorker for Server",
   "main": "lib/index.js",
   "scripts": {
@@ -27,6 +27,7 @@
     "grunt": "^0.4.5",
     "grunt-babel": "^5.0.0",
     "grunt-cli": "^0.1.13",
+    "grunt-contrib-nodeunit": "^0.4.1",
     "grunt-contrib-watch": "^0.6.1",
     "grunt-eslint": "^17.1.0"
   },
diff --git a/src/worker.js b/src/worker.js
index dde73a48ca492fccaf5851e90ca408c1c8260549..9ee0f0fbdfb7fc73a2b2843d873fb38ed8e99d2c 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -24,6 +24,9 @@ process.once("message", function (obj) {
 		sexp;
 
 	global.self = {
+		close: function () {
+			process.exit(0);
+		},
 		postMessage: function (msg) {
 			process.send(JSON.stringify({data: msg}));
 		},
diff --git a/test/worker_repeater.js b/test/worker_repeater.js
new file mode 100644
index 0000000000000000000000000000000000000000..75eb4640ab58c34a99b2b962976bbf4ad4ebf76f
--- /dev/null
+++ b/test/worker_repeater.js
@@ -0,0 +1,3 @@
+self.onmessage = function (ev) {
+	postMessage(ev.data);
+};
\ No newline at end of file
diff --git a/test/worker_test.js b/test/worker_test.js
new file mode 100644
index 0000000000000000000000000000000000000000..f156b0a0bc7616e06565c29e22416d04f4a1c1a9
--- /dev/null
+++ b/test/worker_test.js
@@ -0,0 +1,54 @@
+var path = require("path"),
+	Worker = require(path.join("..", "lib", "index.js"));
+
+exports["external script"] = {
+	setUp: function (done) {
+		this.worker = new Worker(path.join(__dirname, "worker_repeater.js"));
+		this.msg = "Hello World!";
+		this.response = "";
+		done();
+	},
+	test: function (test) {
+		var self = this;
+
+		test.expect(2);
+		test.notEqual(this.msg, this.response, "Should not match");
+
+		this.worker.onmessage = function (ev) {
+			self.response = ev.data;
+			self.worker.terminate();
+			test.equal(self.msg, self.response, "Should be a match");
+			test.done();
+		};
+
+		this.worker.postMessage(this.msg);
+	}
+};
+
+exports["inline script"] = {
+	setUp: function (done) {
+		this.worker = new Worker(function () {
+			self.onmessage = function (ev) {
+				postMessage(ev.data);
+			};
+		});
+		this.msg = "Hello World!";
+		this.response = "";
+		done();
+	},
+	test: function (test) {
+		var self = this;
+
+		test.expect(2);
+		test.notEqual(this.msg, this.response, "Should not match");
+
+		this.worker.onmessage = function (ev) {
+			self.response = ev.data;
+			self.worker.terminate();
+			test.equal(self.msg, self.response, "Should be a match");
+			test.done();
+		};
+
+		this.worker.postMessage(this.msg);
+	}
+};