Dynamics CRM 2011 Unit Test Part 11: QUnit with client side JavaScript

Dynamics CRM 2011 Unit Test Part 1: Introduction and Series Contents

The complete sample code using QUnit can be downloaded from MSDN sample gallery: http://code.msdn.microsoft.com/Dynamics-CRM-2011-client-9f189663

This post describe how to use QUnit and Xrm.Page Script Library Template (Microsoft Visual Studio extension) to unit test Dynamics CRM 2011 client side jQuery or JavaScript code.

More information on Xrm.Page Script Library Templatecan be found: http://msdn.microsoft.com/en-us/library/gg328261.aspx#BKMK_DevelopmentTools

More information on QUnit can be found: http://qunitjs.com/

Suppose we have one JavaScript web resource which will run when account form load. The client side JavaScript code will update the “Account Name” label to “Organisation Name” and set Preferred User look up field value to the Preferred User of the Primary Contact of the current account.

Code Under Test


/// <reference path="XrmPageTemplate.js" />

//This Library uses a namespace naming strategy to help prevent duplication function names
if (typeof (Zzhou) == "undefined")
{ Zzhou = { __namespace: true }; }
if (typeof (Zzhou.Qunit) == "undefined")
{ Zzhou.Qunit = { __namespace: true }; }
// Namespace container for functions in this library.
Zzhou.Qunit.Account = {
 onload: function () {
 var attrName = 'name',
 label = 'Organisation Name';
 this._changeControlLabel(attrName, label);
 this._updatePreferredUser();
 },
 _changeControlLabel: function (attrName, label) {
 var control = Xrm.Page.getControl(attrName);
 if (control) {
 control.setLabel(label);
 }
 },
 _updatePreferredUser: function () {
 // primary contact look up field name
 var attrName = 'primarycontactid';
 // get primary contact attribute
 var attribute = Xrm.Page.getAttribute(attrName);
 if (attribute) {
 // get primary contact attribute value
 var attrValue = attribute.getValue();
 if (attrValue && attrValue[0] && attrValue[0].entityType === 'contact') {
 // get primary contact id
 var primaryContactId = attrValue[0].id;
 // retrieve primary contact.PreferredSystemUserId
 SDK.JQuery.retrieveRecord(
 primaryContactId,
 "Contact",
 "PreferredSystemUserId",
 null,
 // success call back
 function (user) {
 if (user && user.PreferredSystemUserId) {
 var attrName = 'preferredsystemuserid';
 var attribute = Xrm.Page.getAttribute(attrName);
 if (attribute) {
 var lookupReference = [];
 lookupReference[0] = {};
 lookupReference[0].id = user.PreferredSystemUserId.Id;
 lookupReference[0].entityType = user.PreferredSystemUserId.LogicalName;
 lookupReference[0].name = user.PreferredSystemUserId.Name;

attribute.setValue(lookupReference);
 }
 }
 },
 function (error) {
 alert(error.message);
 }
 );
 }
 }
 },
 __namespace: true
};

Unit Test


/// <reference path="XrmPageTemplate.js" />
module(
 'Account Form Library Test',
 {
 setup: function () {
 this.savedAjax = $.ajax;
 },
 teardown: function () {
 $.ajax = this.savedAjax;
 }
 }
 );
test("Zzhou.Qunit.Account._changeControlLabel", function () {
 //
 // Arrange
 //
 var attrName = 'name',
 expectedLabel = 'Organisation Name';
 //
 // Act
 //
 Zzhou.Qunit.Account._changeControlLabel(attrName, expectedLabel);

//
 // Assert
 //
 var actualLabel, control = Xrm.Page.getControl(attrName);
 if (control) {
 actualLabel = control.getLabel();
 }
 strictEqual(actualLabel, expectedLabel, "actualLabel and expectedLabel are the same value and type");
});
test("Zzhou.Qunit.Account._updatePreferredUser", function () {
 expect(3);

//
 // Arrange
 //
 var data = {
 d: {
 PreferredSystemUserId: {
 Id: '5bcf7e47-9993-e111-88fa-00155d4c5b01',
 LogicalName: 'systemuser',
 Name: 'First name Last name'
 }
 }
 };
 $.ajax = function (options) {
 options.success(data, "success", { responseText: JSON.stringify(data) });
 };

//
 // Act
 //
 Zzhou.Qunit.Account._updatePreferredUser();

//
 // Assert
 //
 var attrName = 'preferredsystemuserid';
 var attribute = Xrm.Page.getAttribute(attrName);
 if (attribute) {
 var attrValue = attribute.getValue();
 if (attrValue && attrValue[0]) {
 strictEqual(attrValue[0].entityType, data.d.PreferredSystemUserId.LogicalName);
 strictEqual(attrValue[0].id, data.d.PreferredSystemUserId.Id);
 strictEqual(attrValue[0].name, data.d.PreferredSystemUserId.Name);
 }
 }
});

Advertisements

One comment on “Dynamics CRM 2011 Unit Test Part 11: QUnit with client side JavaScript

  1. Pingback: Dynamics CRM 2011 Unit Test Part 1: Introduction and Series Contents | Zhongchen Zhou's Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s