2014-04-08 12 views
10

Tôi làm việc trên một Ứng dụng góc lớn và ban đầu chúng tôi thực hiện rất nhiều thử nghiệm bằng cách sử dụng $ cung cấp cho các dịch vụ giả lập. Tuy nhiên bây giờ chúng tôi có rất nhiều Jasmine Spies trong các thử nghiệm của chúng tôi để khai thác và gián điệp các dịch vụ.

tức là

spyOn(myService, 'myMethod').andReturn 'myValue' 

nên chúng ta thực sự được sử dụng $ cung cấp cho điều này hay có những trường hợp gián điệp trên một dịch vụ là cách tiếp cận tốt nhất?

Trong thử nghiệm góc, họ sử dụng gián điệp cho spying on Jquery mà tôi sẽ thấy dưới dạng dịch vụ bên ngoài.

spyOn(jq.prototype, 'on'); 

$provide dường như được sử dụng nhiều hơn cho các dịch vụ nội bộ.

module(function($provide){ 
    $provide.provider('$exceptionHandler', $ExceptionHandlerProvider); 
    }); 

Ngoài ra còn có chức năng Jasmine createSpy nhưng giờ tôi nghĩ rằng $ cung cấp phải luôn được ưu tiên hơn.

Mọi thông tin chi tiết hoặc trợ giúp về điều này sẽ được đánh giá cao.

Trả lời

8

Từ riêng (hạn chế) kinh nghiệm của tôi, tôi sẽ nói bất cứ điều gì làm phương pháp làm:

  • Các mã kiểm tra đơn giản/rõ ràng/ngắn
  • Giới hạn giả định về những gì mã thử nghiệm của bạn không trong nội bộ.
  • Giảm tác động phụ của nó (như chạy các yêu cầu Ajax thực tế)
  • Giữ thử nghiệm càng ngắn càng tốt, về mặt thời gian hoặc thời gian chạy.

Thường thì cách tiếp cận spyOn hoạt động khi, để thực hiện việc trên, tôi muốn tạo một phương thức đơn lẻ từ dịch vụ/nhà máy. Nếu tôi cần chế tạo toàn bộ dịch vụ/nhà máy, hãy sử dụng $provide.

Một vài trường hợp cụ thể tôi suy nghĩ rằng yêu cầu này hoặc loại kia:

  • Nếu bạn đang thử nghiệm một dịch vụ, sau đó để còn sơ khai phương pháp khác từ dịch vụ đó, bạn sẽ phải sử dụng spyOn

  • Để đảm bảo rằng các phụ thuộc bổ sung không được giới thiệu sau trong mã đang được kiểm tra, hơn $provide tăng cường bảo vệ một chút. Giả sử, nếu bạn muốn đảm bảo rằng ServiceA chỉ yêu cầu myMethod từ ServiceB, thì $provide Tôi nghĩ là cách để đi, như thể ServiceA gọi bất kỳ phương thức chưa xác định nào từ ServiceB trong khi thử nghiệm, lỗi sẽ được nâng lên.

    $provide.provider('ServiceB', { 
        myMethod: function() {} 
    }); 
    
  • Nếu bạn muốn thử một nhà máy mà trả về một chức năng, vì vậy:

    app.factory('myFactory', function() { 
        return function(option) { 
        // Do something here 
        } 
    }); 
    

    nào được sử dụng như:

    myFactory(option); 
    

    Sau đó, để xác minh rằng một số mã gọi myFactory(option) tôi nghĩ rằng không có cách nào khác để sử dụng $provide để giả lập nhà máy.

Bằng cách này, chúng không phải là các tùy chọn loại trừ lẫn nhau. Bạn có thể sử dụng $provide và sau đó vẫn có gián điệp liên quan. Trong ví dụ trước, nếu bạn muốn kiểm tra máy được gọi với một lựa chọn, bạn có thể phải:

var myFactorySpy = jasmine.createSpy(); 
$provide.provider('myFactory', myFactorySpy); 

Và sau đó trong các thử nghiệm tại thời điểm thích hợp:

expect(myFactorySpy).toHaveBeenCalledWith(option); 
+1

Đó là hữu ích đến từ một góc nhờ. Về việc chế nhạo một nhà máy trả về một hàm - tôi nghĩ bạn cũng có thể làm điều này bằng cách sử dụng createSpy để trả về hàm. – Asta

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