Unit Testing a SAPUI5 controller with QUnit

I am attempting to Unit Test my SAPUI5 app. When I create a new project from template it includes unit tests for the formatter and the model. It does not however include unit tests for a controller.

When I attempt to setup a unit test for a controller in the exact same way as the other two, it does not work. The controller variable comes back undefined.

/*global QUnit*/

sap.ui.define([
    "YAESTEST/YAESTEST/controller/Object.controller"
], function (formatter, controller) {
    "use strict";

    QUnit.module("Object unit");
    oObject = new controller();
    oObject._onObjectMatched();

    QUnit.test("Fake Test", function (assert) {
        assert.strictEqual(true, true, "Object Tested Correctly");
    });
}
);

Through the use of break points I know the sap.ui.define at the top atleast makes it to the file for the controller.

I also tried using something like this, but it does not like the period in Object.controller

jQuery.sap.require("controller", "YAESTEST/YAESTEST/controller/Object.controller");

My controller is defined like this. I have changed nothing from the template.

/*global location*/
sap.ui.define([
        "YAESTEST/YAESTEST/controller/BaseController",
        "sap/ui/model/json/JSONModel",
        "sap/ui/core/routing/History",
        "YAESTEST/YAESTEST/model/formatter"
    ], function (
        BaseController,
        JSONModel,
        History,
        formatter
    ) {
        "use strict";

        return BaseController.extend("YAESTEST.YAESTEST.controller.Object", {

            formatter: formatter,

            /* =========================================================== */
            /* lifecycle methods                                           */
            /* =========================================================== */

            /**
             * Called when the worklist controller is instantiated.
             * @public
             */
            onInit : function () {
                // Model used to manipulate control states. The chosen values make sure,
                // detail page is busy indication immediately so there is no break in
                // between the busy indication for loading the view's meta data
                var iOriginalBusyDelay,
                    oViewModel = new JSONModel({
                        busy : true,
                        delay : 0
                    });

                this.getRouter().getRoute("object").attachPatternMatched(this._onObjectMatched, this);

                // Store original busy indicator delay, so it can be restored later on
                iOriginalBusyDelay = this.getView().getBusyIndicatorDelay();
                this.setModel(oViewModel, "objectView");
                this.getOwnerComponent().getModel().metadataLoaded().then(function () {
                        // Restore original busy indicator delay for the object view
                        oViewModel.setProperty("/delay", iOriginalBusyDelay);
                    }
                );
            },

            /* =========================================================== */
            /* event handlers                                              */
            /* =========================================================== */

            /**
             * Event handler when the share in JAM button has been clicked
             * @public
             */
            onShareInJamPress : function () {
                var oViewModel = this.getModel("objectView"),
                    oShareDialog = sap.ui.getCore().createComponent({
                        name: "sap.collaboration.components.fiori.sharing.dialog",
                        settings: {
                            object:{
                                id: location.href,
                                share: oViewModel.getProperty("/shareOnJamTitle")
                            }
                        }
                    });
                oShareDialog.open();
            },


            /* =========================================================== */
            /* internal methods                                            */
            /* =========================================================== */

            /**
             * Binds the view to the object path.
             * @function
             * @param {sap.ui.base.Event} oEvent pattern match event in route 'object'
             * @private
             */
            _onObjectMatched : function (oEvent) {
                var sObjectId =  oEvent.getParameter("arguments").objectId;
                this.getModel().metadataLoaded().then( function() {
                    var sObjectPath = this.getModel().createKey("PersonCollection", {
                        ID :  sObjectId
                    });
                    this._bindView("/" + sObjectPath);
                }.bind(this));
            },

            /**
             * Binds the view to the object path.
             * @function
             * @param {string} sObjectPath path to the object to be bound
             * @private
             */
            _bindView : function (sObjectPath) {
                var oViewModel = this.getModel("objectView"),
                    oDataModel = this.getModel();

                this.getView().bindElement({
                    path: sObjectPath,
                    events: {
                        change: this._onBindingChange.bind(this),
                        dataRequested: function () {
                            oDataModel.metadataLoaded().then(function () {
                                // Busy indicator on view should only be set if metadata is loaded,
                                // otherwise there may be two busy indications next to each other on the
                                // screen. This happens because route matched handler already calls '_bindView'
                                // while metadata is loaded.
                                oViewModel.setProperty("/busy", true);
                            });
                        },
                        dataReceived: function () {
                            oViewModel.setProperty("/busy", false);
                        }
                    }
                });
            },

            _onBindingChange : function () {
                var oView = this.getView(),
                    oViewModel = this.getModel("objectView"),
                    oElementBinding = oView.getElementBinding();

                // No data for the binding
                if (!oElementBinding.getBoundContext()) {
                    this.getRouter().getTargets().display("objectNotFound");
                    return;
                }

                var oResourceBundle = this.getResourceBundle(),
                    oObject = oView.getBindingContext().getObject(),
                    sObjectId = oObject.ID,
                    sObjectName = oObject.Name;

                oViewModel.setProperty("/busy", false);
                // Add the object page to the flp routing history
                this.addHistoryEntry({
                    title: this.getResourceBundle().getText("objectTitle") + " - " + sObjectName,
                    icon: "sap-icon://enter-more",
                    intent: "#YAESTEST-display&/PersonCollection/" + sObjectId
                });

                oViewModel.setProperty("/saveAsTileTitle", oResourceBundle.getText("saveAsTileTitle", [sObjectName]));
                oViewModel.setProperty("/shareOnJamTitle", sObjectName);
                oViewModel.setProperty("/shareSendEmailSubject",
                oResourceBundle.getText("shareSendEmailObjectSubject", [sObjectId]));
                oViewModel.setProperty("/shareSendEmailMessage",
                oResourceBundle.getText("shareSendEmailObjectMessage", [sObjectName, sObjectId, location.href]));
            }

        });

    }
);