Как смоделировать $ window, введенное вручную в приватную функцию провайдера?

У меня есть следующий провайдер:

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();  
            }
        };
    };

});

И следующий тест спецификации:

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);
    });

});

Мой вопрос, как мне издеваться$window в обоихTest #1 а такжеTest #2 так они успешны? Я пробовал с$provide.value а такжеspyOn для бесчисленных объектов, но я не могу посмеяться над значением$window.navigator.userAgent запустить мои тесты.

Как мне это решить?

П.С .: Приведенный выше код служит только демонстрацией моей проблемы, и я не могу сменить поставщика на услугу из-за особых требований приложения.

Ответы на вопрос(1)

Ваш ответ на вопрос