2010-05-06 52 views
6

Tôi đã thực hiện tái cấu trúc "Replace Method with Method Object" được mô tả bởi Beck.Làm cách nào để đơn vị kiểm tra các phương thức trong đối tượng phương thức?

Bây giờ, tôi có một lớp với phương thức "run()" và một loạt các hàm thành viên phân tách tính toán thành các đơn vị nhỏ hơn. Làm cách nào để kiểm tra các hàm thành viên đó? Ý tưởng đầu tiên của tôi là các bài kiểm tra đơn vị của tôi về cơ bản là bản sao của phương thức "run()" (với các khởi tạo khác nhau), nhưng với các xác nhận giữa mỗi cuộc gọi đến các hàm thành viên để kiểm tra trạng thái tính toán.

(Tôi đang sử dụng Python và các mô-đun unittest.)

class Train: 

    def __init__(self, options, points): 
     self._options = options 
     self._points = points 
     # other initializations 

    def run(self): 
     self._setup_mappings_dict() 
     self._setup_train_and_estimation_sets() 
     if self._options.estimate_method == 'per_class': 
      self._setup_priors() 
     self._estimate_all_mappings() 
     self._save_mappings() 

    def _estimate_all_mappings(): 
     # implementation, calls to methods in this class 

    #other method definitions 

Tôi chắc chắn có những kỳ vọng về những gì các bang các thuộc tính thành viên nên trước và sau khi các cuộc gọi đến các phương pháp khác nhau như là một phần của việc triển khai phương thức run(). Tôi có nên đưa ra các xác nhận về các thuộc tính "riêng tư" này không? Tôi không biết làm cách nào khác để bỏ qua những phương pháp này.

Tùy chọn khác là tôi thực sự không nên thử nghiệm những điều này.

+0

Một số mã hoặc mã giả sẽ hữu ích khi hiểu câu hỏi của bạn. Từ những gì bạn đã viết, có vẻ như bạn có thể hưởng lợi từ phương thức unittest.TestCase.setUp(). http://docs.python.org/library/unittest.html#unittest.TestCase.setUp – msw

+0

Tôi đã chỉnh sửa câu hỏi của bạn bằng mã bạn đã cung cấp. Bạn có thể kiểm tra thụt đầu dòng là chính xác hay không và chỉnh sửa lại nếu cần thiết? –

+0

@ire_and_curses. Cảm ơn, đã chỉnh sửa một chút. –

Trả lời

10

Tôi sẽ trả lời câu hỏi của riêng mình. Sau một chút đọc và suy nghĩ, tôi tin rằng tôi không nên là đơn vị thử nghiệm các phương pháp riêng tư này. Tôi chỉ nên kiểm tra giao diện công cộng. Nếu các phương thức riêng làm xử lý nội bộ đủ quan trọng để kiểm tra độc lập và không chỉ là sự trùng hợp của việc thực hiện hiện tại, thì có lẽ đây là dấu hiệu cho thấy chúng nên được tái cấu trúc thành một lớp riêng biệt.

+1

+1 cho câu trả lời tự và một câu trả lời khá hay ở đó, nếu nó không tuân theo thử nghiệm đơn vị, có lẽ nó không phải là "đơn vị". – msw

6

Tôi thích câu trả lời của bạn, nhưng tôi không đồng ý.

Tình huống mà bạn sẽ sử dụng mẫu thiết kế này là một nơi có một hoạt động khá phức tạp đang diễn ra. Kết quả là abel để xác minh các thành phần riêng lẻ của một hoạt động như vậy tôi sẽ nói là rất mong muốn.

Sau đó, bạn có vấn đề phụ thuộc vào các tài nguyên khác (điều này có thể hoặc có thể không đúng trong trường hợp này).

Bạn cần có khả năng sử dụng một số dạng ioc để tiêm một số dạng giả để cô lập lớp.

Bên cạnh hầu hết các khuôn khổ mocking sẽ cung cấp cho bạn những người truy cập để nhận được ở các thành viên riêng tư.

+0

Cảm ơn bạn đã xem thay thế này. Tôi đã không nhận thức được nhạo báng khi tôi hỏi câu hỏi này. –

+1

Tôi cũng đã thay đổi suy nghĩ của mình từ một lần nữa giống như của bạn. Nếu bạn cần kiểm tra riêng thì có lẽ nó nên được chuyển sang lớp khác. Tuy nhiên tôi nghĩ rằng ý tưởng của tôi vẫn giữ cho những thứ cần phải được nội bộ - không phải là tư nhân. –

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