Template for Testing with Jasmine

Drop in your code, drop in your Jasmine specs, and away you go!

HTML

<script src="http://searls.github.com/jasmine-all/jasmine-all-min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js"></script>
<div data-role="page"></div>

CSS

body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }

#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
#HTMLReporter a { text-decoration: none; }
#HTMLReporter a:hover { text-decoration: underline; }
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
#HTMLReporter .version { color: #aaaaaa; }
#HTMLReporter .banner { margin-top: 14px; }
#HTMLReporter .duration { color: #aaaaaa; float: right; }
#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }
#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
#HTMLReporter .runningAlert { background-color: #666666; }
#HTMLReporter .skippedAlert...

JavaScript

//--- CODE --------------------------
var onTheMove = function(){};
$.extend(onTheMove,{
    NullValue : "null",
    PageDataRoles : 'div[data-role="page"], div[data-role="dialog"]',
    OnTheMovePrefix : 'OnTheMove_'
    });
var OnTheMove_BusinessComponent = function (params) {

        this.callbackWrapper = function (callbackFn) {
            var cb;
            if (callbackFn && callbackFn._isCallbackWrapper) {
                cb = callbackFn;
            }
            else if (typeof callbackFn == 'function') {
                cb = function () {
                    callbackFn.apply(null, arguments);
                    onTheMove.seleniumHelper.markQueryAsCompleted();
                    cb._isCallbackWrapper = true;
                };
            }
            else {
                cb = onTheMove.seleniumHelper.markQueryAsCompleted;
            }

            return cb;
        };

        //this.init(params);
    };
$(document).on('OnPreQuery', onTheMove.PageDataRoles, function (e, options) {
    var isChildAttachmentQueued = true;
    var knockoutContextName = options.knockoutContextName;
    if (TreeEnabled(knockoutContextName)) {
        var isModelReadyToAttachChildren = function () {
            var isReady = false;
            if (PageObj[knockoutContextName] != undefined) {
                isReady = (PageObj[knockoutContextName]().length > 0) && isChildAttachmentQueued;
            }

            return isReady;
        };
        var treeSettings = eval(knockoutContextName).Tree;
        treeSettings.knockoutContextName = knockoutContextName;
        $(onTheMove.PageDataRoles).on('OnTheMoveViewPreLoad', function (e, options) {
            if (isModelReadyToAttachChildren()) {
                getChildrenForMasterRecordList({
                    parentTable: eval(knockoutContextName).primaryTableName,
                    knockoutContextName: treeSettings.knockoutContextName,
                    parentIdColumn: treeSettings.ParentIdColumn,
           ...