2012-06-19 33 views
9

Tôi có chức năng gọi trình định vị địa lý và tôi không biết cách kiểm tra chức năng này. Tôi đã cố gắng gián điệp trên geolocator và trở về dữ liệu giả nhưng không thành công, chức năng ban đầu vẫn được sử dụng và vì vậy tôi sẽ phải chờ đợi và tôi không thể sử dụng dữ liệu giả.Cách gọi trả lại giả từ bộ định vị địa lý trong hoa nhài

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

Tôi làm cách nào để thực hiện việc này?

Trả lời

16

Khi bạn gọi mã geolocation, nó trông như thế này:

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Điều này có nghĩa rằng bạn đang gọi nó và đi qua nó có chức năng:

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 
    } 

Vì vậy, nếu bạn muốn theo dõi nó bằng cách sử dụng hoa nhài trả về một giá trị, bạn muốn gọi hàm thành công bằng cách sử dụng đối số đầu tiên của cuộc gọi ban đầu như sau:

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

Nếu bạn muốn làm cho nó trông giống như một lỗi được trả lại, bạn muốn gọi hàm lỗi bằng cách sử dụng số thứ hai của cuộc gọi ban đầu như thế này:

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

Sửa để hiển thị đầy đủ ví dụ:

Đây là chức năng bạn đang sử dụng Jasmine để kiểm tra:

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

Th là sẽ trong file spec của bạn:

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

Tại thời điểm này, khi bạn chạy spec, nó sẽ cho bạn biết rằng dịch vụ web của bạn đưa cho bạn mã zip thích hợp cho các vĩ độ và kinh độ bạn cung cấp nếu dịch vụ web của bạn làm việc cẩn thận.

+0

Tôi chấp nhận câu trả lời của bạn, vấn đề là mã của tôi tiếp tục gọi bộ mã hóa địa lý gốc và không phải là gián điệp –

+0

Vui lòng xem chỉnh sửa tôi đã thêm để làm rõ thêm. Tôi hy vọng bạn có thể chạy kịch bản thử nghiệm hoa nhài của mình để chạy. :) –

0

Chờ đã, có thể bạn phải tạo gián điệp trong khối beforeEach vì Jasmine tự động khôi phục gián điệp sau mỗi lần kiểm tra. nếu bạn đã làm điều gì đó như:

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

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

gián điệp đã được khôi phục khi bạn muốn kiểm tra. Sử dụng điều này thay vì:

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

it("should work now since the spy is created in beforeEach", function() { 
    // test code 
}); 
+0

Vui lòng chỉnh sửa câu trả lời của bạn và không đăng nhiều câu trả lời. Trong mọi trường hợp, tôi đã tạo ra điệp viên bên trong hàm() của tôi, và gián điệp tôi tạo theo cách này luôn luôn hoạt động, vấn đề là nó nevber trả về dữ liệu giả –

Các vấn đề liên quan