I am currently writing a unit test for Geolocation API.
My Angular component looks as follow:
export class HeaderComponent {
public lat: number = 56.713;
public lng: number = 21.1644;
public message: string;
public messageType: string;
public locationSuccess(data: any) {
console.log(data);
if (data) {
if (data.coords) {
this.lat = data.coords.latitude ? data.coords.latitude : this.lat;
this.lng = data.coords.longitude ? data.coords.longitude : this.lng;
this.messageType = 'success';
this.message = 'You successfully granted us retrieving your location to ' +
'enhance your experience.';
}
}
}
public locationError() {
console.log('error');
this.message = 'Unfortunately we could not acquire your location which is recommended ' +
'for best user experience with our service.';
this.messageType = 'danger';
}
public enableNavigatorLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
this.locationSuccess.bind(this),
this.locationError.bind(this)
);
}
}
}
And my unit test looks like this:
// synchronous beforeEach
beforeEach(() => {
fixture = TestBed.createComponent(HeaderComponent);
comp = fixture.componentInstance;
});
it('enableNavigatorLocation should call locationSuccess if successful', () => {
const locationSuccess = jasmine.createSpy('locationSuccess');
const locationError = jasmine.createSpy('locationError');
spyOn(navigator.geolocation,'getCurrentPosition').and.callFake(function(locationSuccess, locationError) {
const position = { coords: { latitude: 32, longitude: -96 } };
arguments[0](position);
});
comp.enableNavigatorLocation();
expect(locationSuccess).toHaveBeenCalled();
});
My spy is not called and I have no idea what I am doing wrong. Could there be a problem with the function call via bind()
in enableNavigatorLocation
method?
I used this post from 2012 as a guideline