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.