1
votes

There is the following Angular code:

  $scope.clickByPoint = function(marker, eventName, point) {
    var geocoder, location;
    $scope.options.info.point = point;
    $scope.options.info.show = true;
    $scope.searched = false;
    $scope.address = "";
    geocoder = new google.maps.Geocoder();
    location = {
      lat: parseFloat(point.latitude),
      lng: parseFloat(point.longitude)
    };
    geocoder.geocode({location: location}, function(results, status) {
      $scope.searched = true;
      if (status === google.maps.GeocoderStatus.OK) {
        $scope.address = results[0].formatted_address;
      }
      $scope.$digest();
    });
  };

And my Jasmine test:

  describe('$scope.clickByPoint', function() {
    var point;

    beforeEach(inject(function(_Point_) {
      point = _Point_.build('PointName', { latitude: 0, longitude: 0 });
    }));

    describe('try to find the address', function() {
      it('initialize google maps info window', function() {
        $scope.clickByPoint(null, null, point)
        expect($scope.searched).toEqual(true);
      });  
    })
  });

As you can see I'm trying to test 'scope.searched' variable is changed, but it's always 'false', because function is asynchronous. How can I test this code properly? Thanks in advance.

1

1 Answers

0
votes
  • In this case, use a mock of google.maps.Geocoder() in test, using jasmine, because, you are testing clickByPoint() logic and not Google maps api.

        var geocoder = new google.maps.Geocoder(); 
        jasmine.createSpy("geocode() geocoder").andCallFake(function(location, callback) {
            // no wait time ...
            var results = {fake:'', data:''};
            var status = google.maps.GeocoderStatus.OK; // get OK value and set it OR redefine it with a Spy.
            callback(result, status);
         });
    
  • Now you can use your test :

        describe('try to find the address', function() {
            it('initialize google maps info window', function() {
                $scope.clickByPoint(null, null, point);
                expect($scope.searched).toEqual(true);
            });  
        })