Hoặc tốt hơn là sử dụng một Mẫu thiết kế khác?Làm thế nào tôi có thể kiểm tra một lớp Singleton với DUnit?
Trả lời
Đã trả lời cho một câu hỏi tương tự cách đây vài ngày here, mocking a Singleton. Bài viết gốc là dành cho C# .Net liên quan đến việc chế nhạo hành vi của một singleton, nhưng vẫn nên áp dụng.
Về mẫu đơn, không có gì sai với nó - trong nhiều trường hợp, chúng tôi muốn tập trung logic và dữ liệu. Tuy nhiên, có một sự khác biệt rất lớn giữa một singleton và một lớp tĩnh. Xây dựng singleton của bạn như là một mã lớp cứng tĩnh mà thực hiện cho mọi người tiêu dùng trong ứng dụng của bạn - điều này làm cho việc kiểm tra đơn vị rất khó khăn!
Điều bạn muốn làm là xác định giao diện cho singleton của bạn, phơi bày các phương pháp để người tiêu dùng sử dụng. Người tiêu dùng của bạn lần lượt là thông qua tham chiếu đến lớp triển khai bởi bất kỳ ai khởi tạo chúng [thường đây là ứng dụng của bạn hoặc vùng chứa nếu bạn quen với Dependency Injection \ Inversion of Control].
Đó là khuôn khổ này, bất kỳ ai đang khởi tạo người tiêu dùng, chịu trách nhiệm đảm bảo một và chỉ một cá thể đang trôi nổi xung quanh. Nó thực sự không phải là một bước nhảy vọt từ lớp tĩnh đến tham chiếu giao diện [như được minh họa trong liên kết ở trên], bạn chỉ mất đi sự tiện lợi của một cá thể truy cập toàn cầu - tôi biết tôi biết, tham chiếu toàn cầu cực kỳ quyến rũ, nhưng Luke quay lưng lại với Dark Side, bạn cũng vậy!
Nói chung, các phương pháp hay nhất đề xuất tránh tham chiếu tĩnh và khuyến khích tích hợp các giao diện. Hãy nhớ rằng, vẫn có thể áp dụng mẫu đơn với những ràng buộc này. Thực hiện theo các nguyên tắc này và bạn sẽ không gặp phải vấn đề gì khi kiểm tra công việc của mình :)
Hy vọng điều này sẽ hữu ích!
singleton! = Public static class, thay singleton == single dụ
I'm using the following pattern khi tôi viết một độc thân tĩnh dựa trên mà tôi có thể chế nhạo. Mã này là Java, nhưng tôi nghĩ bạn sẽ có một ý tưởng. Vấn đề chính với cách tiếp cận này là bạn phải thư giãn constructor để gói bảo vệ (mà sorta đánh bại một singleton đúng). Là một lưu ý phụ - mã áp dụng cho khả năng giả lập mã "tĩnh" của bạn không nhất thiết phải gọi nó là
Thiếu khả năng kiểm thử là một trong những nhược điểm chính của mô hình Singleton cổ điển (phương thức tĩnh trả về một thể hiện). Theo như tôi đang quan tâm, đó là biện minh đủ để thiết kế lại bất kỳ mã nào sử dụng Singletons để sử dụng một số thiết kế khác.
Nếu bạn hoàn toàn cần phải có một ví dụ đơn lẻ, thì Dependency Injection và ghi vào một giao diện, theo gợi ý của johnny g, chắc chắn là con đường để đi.
Nếu bạn phải sử dụng một singleton (và có nhiều lý do để làm như vậy ... nhưng tôi sẽ luôn luôn cố gắng tránh nó nếu có thể). Tôi khuyên bạn nên sử dụng một container IOC để quản lý nó. Im không chắc chắn nếu có một cho Delphi hay không. Nhưng trong Java bạn có thể sử dụng Spring, trong .NET bạn có thể sử dụng Windsor/Castle. Một container IOC có thể chứa trên Singleton và có thể đăng ký các cài đặt khác nhau để thử nghiệm.
Nó có lẽ là quá lớn của một chủ đề để có được vào đây ngoài đoạn này.
Tôi thường chỉ sử dụng Singletons cho đối tượng Flyweight hoặc các đối tượng có giá trị tương tự. Nhìn vào một container IoC (như đã thảo luận ở trên) có lẽ là một cách tốt hơn để xử lý một đối tượng được chia sẻ hơn một singleton.
Hãy xem xét rằng trong Smalltalk (nơi rất nhiều các mẫu có nguồn gốc), đúng và sai đều có hiệu quả độc thân :)
- 1. Làm thế nào để kiểm tra một lớp Singleton?
- 2. Kiểm tra GUI DUnit: Tôi có thể buộc 'Ứng dụng' sang một "biểu mẫu" khác không?
- 3. Phân cấp kiểm tra DUnit
- 4. Làm thế nào tôi có thể thực hiện một lớp singleton trong perl?
- 5. StructureMap: Làm cách nào tôi có thể kiểm tra lớp đăng ký?
- 6. Làm thế nào để làm cho Delphi DUnit kiểm tra thất bại khi TSQLConnection.Connected = true
- 7. Robolectric: Làm thế nào tôi có thể kiểm tra một hoạt động có chứa một SherlockFragment?
- 8. Làm thế nào để kiểm tra đơn vị lớp Singleton - C++?
- 9. Android: Làm thế nào tôi có thể kiểm tra một mục cụ thể trong một ListView được kiểm tra?
- 10. Làm thế nào tôi có thể kiểm tra xem một đôi có một phần phân đoạn?
- 11. làm thế nào tôi có thể kiểm tra nếu một đối tượng tồn tại trong C++
- 12. làm thế nào tôi có thể kiểm tra accepts_nested_attributes_for với RSpec Rails3
- 13. Trong Java, làm thế nào tôi có thể kiểm tra xem một bộ sưu tập có chứa một cá thể của một lớp cụ thể không?
- 14. Làm cách nào để tùy chỉnh các lớp vỏ kiểm tra DUnit được tạo bởi trình hướng dẫn Test Case?
- 15. Làm thế nào tôi có thể kiểm tra xem một mảng là null/empty?
- 16. Làm thế nào tôi có thể kiểm tra mã bytecode JVM cho một chức năng clojure?
- 17. Làm thế nào tôi có thể kiểm tra rằng "cái gì" là một băm trong Perl?
- 18. Làm cách nào để kiểm tra lớp mẫu của tôi là một loại classtype cụ thể?
- 19. Làm thế nào để kiểm tra nếu một TR chứa TD với một lớp CSS cụ thể với jquery?
- 20. Có thể kiểm tra :: Các bài kiểm tra lớp được chạy song song không? (hoặc làm thế nào để tính ra các bài kiểm tra siêu lớp)
- 21. Làm thế nào tôi có thể kiểm tra ModelState.IsValid từ bên trong xem Razor tôi
- 22. Tôi có thể kiểm tra GC bằng cách nào?
- 23. iOS: Làm thế nào để kiểm tra một lớp nhất định là một loại lớp UIViewController?
- 24. Lớp Singleton với tham số
- 25. Làm thế nào để tái sử dụng các bài kiểm tra JUnit hiện có trong một lớp kiểm tra khác?
- 26. Làm thế nào tôi có thể kiểm tra một bộ điều khiển với các thuộc tính giải quyết trong AngularJS?
- 27. Làm thế nào tôi có thể kiểm tra xem một chuỗi kết thúc với ".csv" trong C
- 28. Làm thế nào tôi có thể viết truy vấn Tiêu chí Hibernate, cho một siêu lớp và kiểm tra một lớp con nhất định?
- 29. Làm thế nào để kiểm tra xem biến là một lớp cụ thể trong python?
- 30. Làm thế nào tôi có thể kiểm tra xem mảng numpy có trống hay không?
... về Smalltalk: yes, nhưng đúng và sai là kiểm chứng _so_ :) – mjn