2010-09-28 34 views
15

Tôi đang sử dụng thư viện mock được viết bởi Michael Foord để trợ giúp thử nghiệm của tôi trên ứng dụng django.Làm thế nào để thử các cuộc gọi hàm xích trong python?

Tôi muốn thử nghiệm rằng tôi đang thiết lập truy vấn của mình đúng cách, nhưng tôi không nghĩ rằng tôi cần thực sự nhấn vào cơ sở dữ liệu, vì vậy tôi đang cố gắng thử truy vấn.

Tôi có thể giả lập phần đầu tiên của truy vấn rất tốt, nhưng tôi không nhận được kết quả tôi muốn khi tôi chuỗi các thứ khác.

Chức năng:

 
    @staticmethod 
    def get_policies(policy_holder, current_user): 
     if current_user.agency: 
      return Policy.objects.filter(policy_holder=policy_holder, version__agency=current_user.agency).distinct() 
     else: 
      return Policy.objects.filter(policy_holder=policy_holder) 

và thử nghiệm của tôi: Khẳng định đầu tiên trôi qua, điều thứ hai thất bại.

 
    def should_get_policies_for_agent__user(self): 
     with mock.patch.object(policy_models.Policy, "objects") as query_mock: 
      user_mock = mock.Mock() 
      user_mock.agency = "1234" 
      policy_models.Policy.get_policies("policy_holder", user_mock) 
      self.assertEqual(query_mock.method_calls, [("filter",(), { 
       'policy_holder': "policy_holder", 
       'version__agency': user_mock.agency, 
      })]) 
      self.assertTrue(query_mock.distinct.called) 

Tôi chắc rằng vấn đề là các query_mock ban đầu được trả lại một mô hình mới sau khi .filter() được gọi, nhưng tôi không biết làm thế nào để nắm bắt mà giả mới và chắc chắn rằng .distinct() đã được gọi vào nó.

Có cách nào tốt hơn để thử nghiệm những gì tôi đang cố gắng đạt được không? Tôi đang cố gắng đảm bảo rằng truy vấn thích hợp đang được gọi.

+4

Vui lòng không lãng phí thời gian để trích xuất các truy vấn Django. Chỉ cần tạo một "fixture" và chạy các truy vấn thực sự đối với dữ liệu lịch thi đấu của bạn. Nó đơn giản hơn nhiều và tạo ra kết quả kiểm tra hữu ích hơn nhiều. –

+0

Cảm ơn bạn đã bình luận. Chúng tôi đã sử dụng đồ đạc nhưng đang cố gắng tránh xa chúng trong một số trường hợp vì hai lý do. một: mô hình của chúng tôi rất phức tạp với rất nhiều mối quan hệ. thiết lập đồ đạc cho trường hợp cụ thể này sẽ cần dữ liệu lịch thi đấu cho người dùng, công ty, đại lý, chủ hợp đồng, chính sách và phiên bản. Tôi không cần phải thực sự chạy truy vấn, tôi chỉ cần chắc chắn rằng nó được thiết lập đúng cách. hai: thử nghiệm của chúng tôi chạy chậm hơn rất nhiều bằng cách sử dụng đồ đạc – Aaron

+0

@Aaron: Chúng tôi làm điều này. (1) chạy quản trị viên tích hợp để tạo dữ liệu. (2) thực hiện một bãi chứa dữ liệu của các trang quản trị được tạo bằng tay. Đồ đạc của chúng tôi là nhỏ (hàng chục hàng nhiều nhất), tải rất nhanh chóng, và tiết kiệm chúng tôi cố gắng để thử ra Django chính nó. –

Trả lời

15

Mỗi đối tượng giả định giữ đối tượng giả mà nó trả về khi nó được gọi. Bạn có thể nắm giữ nó bằng cách sử dụng thuộc tính return_value của đối tượng giả của bạn.

Ví dụ của bạn,

self.assertTrue(query_mock.distinct.called) 

biệt không được gọi vào mô hình của bạn, nó được gọi là trên giá trị trả về của phương pháp lọc của mô hình của bạn, vì vậy bạn có thể khẳng định rằng biệt được gọi là bằng cách làm này :

self.assertTrue(query_mock.filter.return_value.distinct.called) 
+0

Rất đơn giản ... Cảm ơn bạn đã cung cấp câu trả lời hữu ích, rõ ràng. Hữu ích hơn rất nhiều so với lời nói ngỏ sau và giữa bạn và S.Lott ... – Aaron

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