6

Tôi đang viết một số mô-đun JavaScript có nghĩa là chạy trong trình duyệt (phía máy khách, không phải phía máy chủ). Mô-đun này đang sử dụng Google Maps JavaScript API.Cách viết kiểm tra đơn vị trên mã đang sử dụng Google Maps cho JS

Tôi muốn bao gồm mã của mình theo các bài kiểm tra đơn vị. Tôi cũng muốn các bài kiểm tra của tôi bị cô lập. Tôi đã tìm thấy severalvcr giống như JSlibraries để ghi và nhại các yêu cầu HTTP mà Google Maps Api đang tạo. Nhưng tất cả chúng đều dành cho Node.JS (vì PhantomJS doesn't support using fs module). Node.JS cũng có nhiều backtraces phong phú và dễ đọc hơn PhantomJS.

Vì vậy, tôi tự hỏi làm cách nào để đưa API Javascript của Google Maps vào các thử nghiệm của tôi với thử nghiệm dựa trên Node.JS và cách viết thử nghiệm cho mã của tôi?

P.S. Tôi không gắn bó với một số thư viện thử nghiệm đơn vị JS nào đó. Nó có thể là Jasmine, QUnit hay bất kỳ thứ gì khác.

P.P.S Không cần thiết phải là Node.JS runner. Nếu có một lựa chọn khác, nó hoàn toàn OK!

P.P.P.S. Mục tiêu của tôi là để tránh những điều sau đây:

  1. để tránh sự phụ thuộc vào kết nối internet và sự chậm trễ tương ứng trong các thử nghiệm
  2. để tránh kiểm tra thất bại vì thay đổi một số dữ liệu GEO trên các máy chủ của Google. Ví dụ: nếu tôi sử dụng chỉ đường, tôi không thực sự quan tâm nếu nó là 2000 mét hoặc 2001 mét, tôi chỉ muốn biết rằng tôi nhận được một số dữ liệu thích hợp từ Google và thực hiện một số phép tính với nó.

P.P.P.P.S. Nhờ @MichaelGeary answer chúng tôi biết rằng Google chỉ lưu 3 phiên bản API của họ. Nhưng tôi không chỉ tập trung vào Google Maps, tôi đã chọn nó trong câu hỏi đó vì nó phổ biến/tôi có cùng câu hỏi được áp dụng cho bất kỳ bản đồ api nào khác như Yandex.Maps, Leaflet (with openstreet), Bing và v.v. API, vì vậy tôi có thể sửa phiên bản và dựa vào việc không thay đổi API nội bộ và các yêu cầu HTTP.

Ngoài ra tôi muốn tránh địa ngục giả, vì mã của tôi khá phức tạp và sử dụng rất nhiều đối tượng địa lý thuộc loại khác nhau. Vì vậy, sẽ không dễ dàng giả lập tất cả chúng và sau đó hỗ trợ mã đó. Nó trông giống như điều không thể chịu nổi.

Ý tưởng của tôi là sửa phiên bản API một thời gian (trong trường hợp của Google trong thời gian không lâu) và dựa vào sự kiên trì của định dạng yêu cầu HTTP nội bộ. Và theo thời gian xóa tất cả dữ liệu được ghi lại để chắc chắn rằng mọi thứ vẫn OK trong thế giới thực.

Tôi muốn bản thân mình là người kiểm soát thời điểm tôi nên sửa bài kiểm tra của mình. Tôi không muốn Google phá vỡ các bài kiểm tra của tôi vào thời điểm ngẫu nhiên.

+0

Một điều bạn chắc chắn * không * muốn làm là sử dụng thư viện ghi lại và phát lại các yêu cầu HTTP mà JavaScript Maps API sử dụng. Các URL và phản hồi yêu cầu này không có giấy tờ, riêng tư đối với mã API Maps và có thể thay đổi bất kỳ lúc nào. Bất kỳ bài kiểm tra nào bạn viết đều chỉ dựa trên API được lập tài liệu, nếu không bạn sẽ thấy các bài kiểm tra của mình không tự ý khi Google thay đổi nội dung API. –

+0

@MichaelGeary, mục tiêu của tôi là tránh một số thứ: 1) để tránh sự phụ thuộc vào kết nối internet và sự chậm trễ tương ứng 2) để tránh bị lỗi do thay đổi một số dữ liệu GEO trên máy chủ của Google.Ví dụ: nếu tôi sử dụng chỉ đường, tôi không thực sự quan tâm nếu nó là 2000 mét hoặc 2001 mét, tôi chỉ muốn biết rằng tôi nhận được một số dữ liệu thích hợp từ Google và thực hiện một số phép tính với nó. Vì vậy, tôi không muốn phát lại các yêu cầu HTTP về sản xuất hoặc thậm chí trong các thử nghiệm. Tôi chỉ muốn thử tất cả các yêu cầu HTTP để làm cho các bài kiểm tra của tôi bị cô lập. – petRUShka

+0

Điều này nghe có vẻ nhiều hơn với tôi như thử nghiệm chức năng. Quả thực bản thân Phantomjs không có API cho điều đó nhưng [Casper.js] (http://casperjs.org/) sẽ tốt. –

Trả lời

2

Ghi hoặc chế nhạo các yêu cầu HTTP được thực hiện bởi Maps API chắc chắn là một ý tưởng thú vị!

Thật không may, giống như bất kỳ tính năng không có giấy tờ nào khác của API, các yêu cầu này là chi tiết triển khai nội bộ và có thể thay đổi bất kỳ lúc nào. Google tung ra các phiên bản mới của mã API bốn lần một năm, cùng với các bản sửa đổi bản vá thường xuyên vài tuần một lần. Bất kỳ nội dung API nào trong số — bao gồm các yêu cầu HTTP — có thể thay đổi từ một phiên bản sang phiên bản tiếp theo, ngay cả trong bản sửa đổi bản vá. Điều duy nhất họ đảm bảo ổn định trên các phiên bản hoặc bản vá là API được ghi lại.

Google cung cấp cho bạn khả năng request a specific API version, nhưng chúng không giữ phiên bản cũ trong khoảng thời gian rất dài và chúng không giữ bản sửa đổi bản vá cũ. Trong thực tế, chỉ có ba phiên bản là trực tiếp bất cứ lúc nào. Tại văn bản này, các phiên bản này có sẵn:

  • Phiên bản thử nghiệm, hiện tại là 3.21.4.
  • Phiên bản phát hành, hiện tại là 3.20.12.
  • Phiên bản đã được cố định, hiện tại là 3.19.19.

Khi phiên bản thử nghiệm tiếp theo (3.22) được tung ra, 3.21 sẽ trở thành phiên bản phát hành, 3.20 phiên bản đã được cố định và 3.19 sẽ ngừng hoạt động và không còn nữa.

Phiên bản cố định không có khác biệt so với phiên bản thử nghiệm và phiên bản thử nghiệm: nó không còn nhận được bất kỳ bản vá nào để nó hoàn toàn ổn định. Cần đảm bảo rằng các yêu cầu HTTP được thực hiện bởi phiên bản được cố định sẽ không thay đổi. Nhưng điều này chỉ giúp cho đến khi phiên bản đó được gỡ bỏ.

Dưới đây là fiddle để thử nghiệm với yêu cầu các phiên bản API khác nhau và hiển thị phiên bản nào thực sự được tải. Mã này trông như thế này:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Google Maps API version test</title> 
</head> 

<body> 
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script> 
    <script src="http://maps.google.com/maps/api/js?v=3.18&sensor=false"></script> 

    <div id="version"></div> 

    <script> 
     $('#version').text(
      'google.maps.version is ' + 
      google.maps.version 
     ); 
    </script> 

</body> 
</html> 

các fiddle sử dụng một tham số v=3.18 trong Maps URL kịch bản API để yêu cầu phiên bản 3.18, nhưng nó thực sự tải phiên bản 3.19.19 tại thời điểm này. Bạn có thể thay đổi thông số v= thành các giá trị khác nhau để xem phiên bản API nào được tải. (Bên cạnh các phiên bản được đánh số cụ thể, bạn cũng có thể sử dụng v=3 để lấy phiên bản ổn định hiện tại hoặc v=3.exp để lấy phiên bản thử nghiệm hiện tại.)

Trình đọc mắt sắc nét có thể lưu ý rằng thuộc tính google.maps.version mã này hiển thị là không có giấy tờ ! Nhưng này, đây là mã thử nghiệm thử nghiệm. :-)

Khá phổ biến đối với các yêu cầu HTTP thay đổi từ phiên bản sang phiên bản và thậm chí có thể cho chúng thay đổi trong bản sửa đổi bản vá. Như bạn có thể thấy từ danh sách trên, phiên bản 3.19 đã trải qua 19 bản sửa đổi bản vá và 3.20 đã trải qua 12 bản sửa đổi bản vá.

Nếu bạn muốn viết các bài kiểm tra đơn vị cho mã API Maps của bạn, đề xuất của tôi là giả lập bản đồ API được ghi tài liệu thay vì chế nhạo bất kỳ nội bộ nào của nó. Ví dụ, giả lập của bạn cho google.maps.Map có thể kiểm tra tham số đầu tiên của nó là một nút DOM và tham số thứ hai (tùy chọn) của nó chỉ chứa các thuộc tính đã biết với các giá trị hợp lệ cho các thuộc tính đó.

Tất nhiên API Maps hiển thị khá nhiều đối tượng, phương pháp và thuộc tính, nhưng bạn không phải giả mạo toàn bộ, chỉ là các phần của nó mà bạn đang sử dụng.

+0

Cảm ơn bạn đã trả lời chi tiết như vậy! Tôi chỉ muốn nói rằng: 1) Tôi nghĩ rằng mocking API là gần như ok trong một số trường hợp đơn giản, nhưng trong trường hợp của tôi tôi nên thử rất nhiều (tôi đang làm việc với các hướng dẫn, và các bước và vv)! Nó sẽ là địa ngục để hỗ trợ mã như vậy; 2) Tôi cũng sẽ phải đối mặt với cùng một vấn đề: không ai đảm bảo sự tồn tại của biểu diễn dữ liệu (ví dụ: địa chỉ hoặc tọa độ của một số đối tượng). 3) Tôi không chỉ tập trung vào Google Maps, tôi đã chọn chúng trong câu hỏi đó vì nó phổ biến; Tôi có cùng một câu hỏi được áp dụng cho bất kỳ bản đồ nào khác (hầu hết trong số họ không xóa apis cũ). Xem cập nhật – petRUShka

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