2013-07-26 52 views
12

Tôi đã mã hóa các trường hợp thử nghiệm cho một ứng dụng góc sử dụng hoa nhài. Nhưng nhiều phương thức nội bộ được khai báo là riêng tư trong các dịch vụ.Phương pháp riêng Thử nghiệm đơn vị với Jasmine

Ví dụ:

App.service('productDisplay', function(){ 
    var myPrivate = function(){ 
     //do sth 
    } 
    this.doOfferCal = function(product, date){ 
     //call myPrivate 
     //do sth too 
     return offer; 
    } 
}); 

Sử dụng hoa nhài nó đơn giản để kiểm tra mã cho "doOfferCal" nhưng tôi muốn viết bài kiểm tra đơn vị cho myPrivate quá.

Tôi có thể làm như thế nào?

Xin cảm ơn trước.

+0

có thể trùng lặp của [Làm thế nào để kiểm tra một lớp có phương thức riêng, trường hoặc lớp bên trong?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or -inner-classes) – Raedwald

Trả lời

0

Để kiểm tra chức năng bên trong Tôi gọi hàm ngoài gọi hàm bên trong và sau đó thay đổi đầu vào của tôi theo những gì hàm bên trong yêu cầu. Vì vậy, trong trường hợp của bạn, bạn sẽ gọi 'productDisplay' và thay đổi đầu vào của bạn dựa trên những gì 'myPrivate' cần và sau đó xác minh rằng bạn có đầu ra dự kiến. Bạn cũng có thể theo dõi 'myPrivate' và kiểm tra mọi thứ theo cách đó bằng cách sử dụng .havebeencalledwith hoặc .andcallthrough.

8

Có lý do cụ thể nào bạn muốn thử nghiệm các phương pháp riêng tư của mình không?

Bằng cách kiểm tra doOfferCal(), bạn đang kiểm tra ngầm rằng myPrivate() đang làm điều đúng.

Mặc dù đây là dành cho RailsConf, Sandi Metz có một cuộc trò chuyện rất hay trên what should be tested.

+0

"doOfferCal" của tôi gọi nhiều phương thức riêng tư và cuối cùng trả về một kết quả phức tạp vì tại sao nghĩ rằng nó sẽ là tốt để kiểm tra từng phương thức riêng. Bằng cách nào bạn có bất cứ đề nghị trong tình huống này? – arnold

+2

Một trường phái tư tưởng là các phương pháp riêng tư là các chi tiết thực hiện. Bằng cách thử nghiệm các phương pháp riêng tư của bạn, các thử nghiệm của bạn sẽ bị phá vỡ ngay cả khi phương pháp công khai của bạn vẫn hoạt động chính xác. Kết quả là, bạn có thể sẽ tạo ra các bài kiểm tra quá giòn và sợ các nhà phát triển cải thiện/tái cấu trúc việc triển khai. – achan

+2

Xin lỗi, tôi đã không nhận ra nhấn Enter sẽ gửi bài của tôi .. Những gì tôi sẽ làm trong trường hợp này là kiểm tra 'doOfferCal()' và sau đó xác minh đối tượng phức tạp nó trả về. Nếu kiểm tra đó trôi qua, tất cả các phương thức riêng ở giữa đều hoạt động như dự định. Tôi chắc chắn bạn sẽ tìm thấy những người hỗ trợ các phương pháp riêng tư, nhưng đây là những gì tôi đã tìm thấy hoạt động tốt nhất cho tôi về viết các bài kiểm tra đơn vị hữu ích và duy trì. – achan

2

Achan là 100% đúng, nhưng nếu bạn thực sự cần phải gọi phương thức riêng trong các thử nghiệm của bạn (những gì nên không bao giờ :-)) bạn có thể làm điều đó bằng cách:

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough(); 
myPrivateSpy.call(); 
Các vấn đề liên quan