Wie versuche ich, $ window manuell in die private Funktion des Anbieters einzufügen?

Ich habe folgenden Anbieter:

angular.module('MyApp').provider('MyDevice', function () {

    var ngInjector = angular.injector(['ng']),
        $window = ngInjector.get('$window');

    function isMobileDevice () {
        return (/iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/)
            .test($window.navigator.userAgent || $window.navigator.vendor || $window.opera);
    }

    this.$get = function () {
        return {
            isDesktop: function () {
                return !isMobileDevice();
            },
            isMobile: function () {
                return isMobileDevice();  
            }
        };
    };

});

Und folgende Testspezifikation:

describe('MyDeviceProvider', function () {

    var myDevice;

    beforeEach(function () {
        inject(['MyDevice', function (_myDevice_) {
            myDevice = _myDevice_;
        }]);
    });

    it('Test #1', function () {
        // Mock '$window.navigator.userAgent' to "desktop"
        expect(myDevice.isDesktop()).toEqual(true);
        expect(myDevice.isMobile()).toEqual(false);
    });

    it('Test #2', function () {
        // Mock '$window.navigator.userAgent' to "mobile"
        expect(myDevice.isDesktop()).toEqual(false);
        expect(myDevice.isMobile()).toEqual(true);
    });

});

Meine Frage ist, wie ich mich verspotte$window sowohlTest #1 undTest #2 Also sind sie erfolgreich? Ich habe es mit versucht$provide.value undspyOn für unzählige Objekte, aber ich kann nicht scheinen, den Wert von zu verspotten$window.navigator.userAgent um meine tests durchzuführen.

Wie löse ich das?

PS: Der obige Code dient nur zur Veranschaulichung meines Problems und ich kann den Anbieter aufgrund spezieller Anforderungen der Anwendung nicht in einen Dienst umwandeln.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage