13

我有一个调用地理定位器的函数,但我不知道如何测试这个函数。我尝试监视地理定位器并返回假数据,但没有成功,原始功能仍在使用,所以我不得不等待,我不能使用模拟数据。

// this doesn't work        
var navigator_spy = spyOn( navigator.geolocation, 'getCurrentPosition' ).andReturn( {
    coords : {
        latitude : 63,
        longitude : 143
    }
} );

我怎样才能做到这一点?

4

2 回答 2

20

当您调用地理位置代码时,它看起来像这样:

  navigator.geolocation.getCurrentPosition(onSuccess, onError);

这意味着您正在调用它并传递它的功能:

  function onSuccess(position) {
      // do something with the coordinates returned
      var myLat = position.coords.latitude;
      var myLon = position.coords.longitude;
  }

  function onError(error) {
      // do something when an error occurs
  }

因此,如果您想使用 jasmine 返回值来监视它,您需要使用原始调用的第一个参数调用成功函数,如下所示:

  spyOn(navigator.geolocation,"getCurrentPosition").andCallFake(function() {
         var position = { coords: { latitude: 32, longitude: -96 } };
         arguments[0](position);
  });

如果你想让它看起来像返回了一个错误,你会想使用原始调用的第二个参数来调用错误函数,如下所示:

  spyOn(navigator.geolocation,"getCurrentPosition").andCallFake(function() {
         arguments[1](error);
  });

编辑以显示完整示例:

这是您使用 Jasmine 测试的功能:

  function GetZipcodeFromGeolocation(onSuccess, onError) {
        navigator.geolocation.getCurrentPosition(function(position) {
              // do something with the position info like call
              // an web service with an ajax call to get data
              var zipcode = CallWebServiceWithPosition(position);
              onSuccess(zipcode);
        }, function(error) {
              onError(error);
        });
  }

这将在您的规范文件中:

  describe("Get Zipcode From Geolocation", function() {
        it("should execute the onSuccess function with valid data", function() {
              var jasmineSuccess = jasmine.createSpy();
              var jasmineError = jasmine.createSpy();

              spyOn(navigator.geolocation,"getCurrentPosition").andCallFake(function() {
                     var position = { coords: { latitude: 32.8569, longitude: -96.9628 } };
                     arguments[0](position);
              });

              GetZipcodeFromGeolocation(jasmineSuccess, jasmineError);

              waitsFor(jasmineSuccess.callCount > 0);

              runs(function() {
                    expect(jasmineSuccess).wasCalledWith('75038');
              });
        });
  });

此时,当您运行规范时,它会告诉您,如果您的 Web 服务正常工作,您的 Web 服务会根据您提供的纬度和经度为您提供正确的邮政编码。

于 2012-09-06T20:01:12.040 回答
1

等等,也许你必须在你的beforeEach块中创建间谍,因为 Jasmine 在每个测试用例之后会自动恢复间谍。如果你做了类似的事情:

var navigator_spy = spyOn( navigator.geolocation, 'getCurrentPosition' )

it("should stub the navigator", function() {
   // your test code
});

当你想测试它时,间谍已经恢复了。改用这个:

beforeEach(function() {
    this.navigatorSpy = spyOn( navigator.geolocation, 'getCurrentPosition' )
});

it("should work now since the spy is created in beforeEach", function() {
    // test code
});
于 2012-06-19T20:18:31.263 回答