Javascript jasmine

From John Freier
Revision as of 11:27, 28 May 2015 by Jfreier (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Install

Installing Jasmine-node is very simple.

 npm install jasmine-node

I would also recommend using package.json. This is kind of like a dependency manager. When a project has this it will install all the module local and you can use them.

package.json

 {
   "name":"test",
   "version":"0.0.0",
   "description":"This is a sample file.",
   "private": true,
   "dependencies": {
   },
   "devDependencies": {
     "bower": "1.4.1",
     "jasmine-node": "1.14.5",
     "jquery": "2.1.4",
     "jsdom": "3.1.2",
     "knockout": "3.3.0"
   },
   "engines": {
     "node": ">=0.10.0"
   }
 }

To install all the dependencies in package.json, simple type

 npm install

Tip #1: json format is very specific, use spaces and double quotes.

Tip #2: devDependencies will install the dependencies to the local project folder.

Tip #3: sometimes you need to use sudo when installing them.

Tip #4: You might want to add node_modules and npm-debug.log to your .gitignore.



RequireJS

Using RequireJS with Jasmine is totally possible.

1. To load in your modules to test, you must tell Jasmine-node to run using requireJS and not node-require.

  jasmine-node --runWithRequireJs --requireJsSetup etc/spec/requirejs-setup.js etc/spec/ --captureExceptions

2. Need to setup the require-setup.js. This require the use of coping two files from github.

https://github.com/mhevery/jasmine-node/blob/master/spec-requirejs/requirejs-setup.js

and

https://github.com/mhevery/jasmine-node/blob/master/spec-requirejs/requirejs-wrapper-template.js

3. Just setup you test. and done.

 require(['classService.js'], function(ClassService) {
 	
 	describe('ClassService Tests', function() {
 		
 		it('should default', function() {
 			
 			var classService = new ClassService();
 			
 			expect(classService.getName()).toBe('Ok');
 			
 		});		
 	
 	});
 	
 });


RequireJS and JQuery

To setup Jasmine to run unit test agains modules that use jquery you need to first import the jquery package through NPM. Then you need to set up a headless browser using JSDom and then attach it to the module you want to test.

1. Install NPM require packages.

 npm install jquery
 npm install jsdom

2. Write your test and include headless DOM.

 require(['jquery', 'jsdom', 'jqueryService.js'], function($, jsdom, JQueryService) {
 	
 	describe('JQueryService Tests', function() {
 		
 		it('should default', function() {
 			
 			// Create headless DOM model.
 			var markup = '<html><body><button id="nextButton">Hello</button></body></html>';
 			var myWindow = jsdom.jsdom(markup).parentWindow;
 			$ = new $(myWindow);
 			
 			var jqueryService = new JQueryService($);
 
 			jqueryService.changeButtonId();
 			
 			expect($("#nextButton").html()).toBe('Ok');
 			
 		});		
 	
 	});

3. Here is the example module that is being tested.

 define(
 	[
 	 	'jquery'
 	],
 	function($) {
 	
 		 function JQueryService(jq) {
 			 
 			 if(jq) $ = jq;
 
 			 this.changeButtonId = function() {
 				 $('#nextButton').html('Ok');
 			 }
 			 
 		 }
 		 
 		 // Define the class methods.
 		 JQueryService.prototype = {};
 		 
 		 // Return the module constructor.
 		 return( JQueryService );
 		
 	}
   );
 });


RequireJS Knockout

To test your Knockout modules with Jasmine-node you just have you install knockoutjs through NPM and it use require to load your module you want to test.

1. Install Knockout in to your node modules.

 npm install knockout

2. Just include your module that is already requiring Knockout.

Test

 require(['requireModel.js'], function(RequireModel) {
 	
 	describe('Require Model Tests', function() {
 		
 		it('should default to require 1650', function() {
 			
 			var model = new RequireModel();
 			
 			expect(model.id()).toBe(1650);
 			expect(model.getRequire()).toBe('/require/1650');
 			
 		});
 	});
 });

Module (requireModule.js)

 define(
 	[
 	 	/* No dependencies */
 	 	'knockout'
 	],
 	function(ko) {
 	
 		 function RequireModel() {
 			 //...
 			 this.urlContext = '/require/'; 
 
 			 this.id = ko.observable(1650);
 			 
 			 this.getRequire = function() {
 				return this.urlContext + this.id();
 			 };
 		 }
 		 
 		 // Define the class methods.
 		 RequireModel.prototype = {};
 
 		 // Return the module constructor.
 		 return( RequireModel );
 	}
 );