¿Cómo pruebo una función que llama a una función AJAX sin dispararla usando jazmín?

Me he registrado¿Cómo verifico los eventos de jQuery AJAX con Jasmine? y¿Cómo probar un controlador angular con una función que realiza una llamada AJAX sin burlarse de la llamada AJAX? pero por alguna razón no necesariamente salen con un formato que me funcione.

Mi problema es que estoy probando una función que hace una llamada a una función que dispara una solicitud AJAX. Quiero probar la función externa sin disparar la solicitud de AJAX (o detener esa solicitud) para no obtener un montón de datos defectuosos en el servidor de datos.

Aquí está mi función externa (que llama a la función que contiene el AJAX):

vm.clickSubmit = function () {
    vm.loading = true; // starts the loading spinner
    vm.updateData(); // makes current data current in the data model
    vm.inputData = {    // build the data to be submitted
        ...
    };
    vm.submit(); // calls the AJAX function
};

Aquí está mi función AJAX:

vm.submit = function () {
    var d = $.ajax({
        type: "POST"
        , data: angular.toJson(vm.inputData)
        , url: "http://submit_the_data"
        , contentType: "application/json"
        , xhrFields: { withCredentials: true }
        , crossDomain: true
    })
    .success(function (resp) {
        DataService.ticketNumber = resp; // returns ticket# for the data model
    })
    .error(function (error) {
        DataService.ticketNumber = DataService.submitError;
    });
    d.then(function (d) {
        vm.loading = false; // stops the loading spinner
        DataService.tickets = []; // empty's the array to be filled anew
        $location.path('/submitted'); // success splash html
        $scope.$apply();
    });
};

He escrito todas las pruebas que leerán y verificarán los valores en elinputData objeto, pero no estoy seguro de cómo rodear la llamada aclickSubmit() así que nada se envía realmente al servidor. Llegué a este punto en las pruebas de mi unidad:

'use strict';

describe('Controller: HomeController', function () {
    beforeEach(module('tickets'));
    var controller, scope, $location, DataService;
    var tests = 0;
    beforeEach(inject(function ($rootScope, $controller, _$location_, _DataService_) {
        $location = _$location_;
        DataService = _DataService_;
        scope = $rootScope.$new();
        controller = $controller('HomeController', {
            $scope: scope
        });
    }));
    afterEach(function () {
        tests += 1;
    });
    describe('clickSubmit should verify data and submit new ticket', function () {
        beforeEach(function () {
            jasmine.Ajax.install();
            controller.loading = false;
                ... // inputData fields filled in with test data
        });
        afterEach(function () {
            jasmine.Ajax.uninstall();
        });
        it('should start the spinner when called', function () {
            controller.clickSubmit();
            expect(controller.loading).toBeTruthy();
        });
        // other it('') tests
    });
    it('should have tests', function () {
        expect(tests).toBeGreaterThan(0);
    });
});

Entonces, ¿qué debería pasar después de lo esperado en la flecha de carga para cancelar la llamada avm.submit() en el código real?

Gracias,

-C§

Respuestas a la pregunta(1)

Su respuesta a la pregunta