2011-12-12 21 views
45

Tôi đang cố gắng thử nghiệm nội dung nào đó trong khi thử nghiệm một ứng dụng Django bằng cách sử dụng hình ảnh có tên là Mock testing library. Tôi dường như không thể làm cho nó hoạt động được, tôi đang cố gắng làm điều này:Sử dụng bản vá giả để mô phỏng phương pháp thể hiện

models.py 

from somelib import FooClass 

class Promotion(models.Model): 
    foo = models.ForeignKey(FooClass) 
    def bar(self): 
     print "Do something I don't want!" 


test.py 

class ViewsDoSomething(TestCase): 
    view = 'my_app.views.do_something' 

    def test_enter_promotion(self): 
     @patch.object(my_app.models.FooClass, 'bar') 
     def fake_bar(self, mock_my_method): 
      print "Do something I want!" 
      return True 

     self.client.get(reverse(view)) 

Tôi đang làm gì sai?

+0

'' 'bar''' thực chất là một "phương pháp dụ," và tham số duy nhất của nó là' '' self' ''. Để trở thành một phương thức lớp, nó sẽ cần phải được tham số hóa với '' 'cls''', và sẽ được gọi là' '' Promotion.foo() '' '. – cavaunpeu

+0

Đối tượng có thể vá cần phải được trích dẫn như sau: '@ patch.object ('my_app.models.FooClass', 'bar')' – Lasma

+0

@cavaunpeu - không (chỉ) được tham số hóa với 'cls', nhưng quan trọng hơn (vì 'self' và' cls' không có ý nghĩa gì đặc biệt trong python), được trang trí với '@ classmethod' – dwanderson

Trả lời

21

Ah Tôi đã nhầm lẫn về nơi áp dụng trang trí miếng vá đó. Đã sửa lỗi:

class ViewsDoSomething(TestCase): 
    view = 'my_app.views.do_something' 

    @patch.object(my_app.models.FooClass, 'bar') 
    def test_enter_promotion(self, mock_method): 
     self.client.get(reverse(view)) 
+14

Bạn tạo kết nối giữa phương thức giả lập và giả lập hiện tại ở đâu? – physicalattraction

27

Để thêm vào câu trả lời của Kit, chỉ định đối số thứ 3 cho patch.object() cho phép đối tượng/phương thức được chỉ định được chỉ định. Nếu không, một đối tượng mặc định là MagicMock được sử dụng.

def fake_bar(self): 
     print "Do something I want!" 
     return True 

    @patch.object(my_app.models.FooClass, 'bar', fake_bar) 
    def test_enter_promotion(self): 
     self.client.get(reverse(view)) 
     # Do something I want! 

Lưu ý rằng, nếu bạn chỉ định các đối tượng chế nhạo, sau đó mặc định MagicMock()không còn truyền vào đối tượng vá - ví dụ không còn:

def test_enter_promotion(self, mock_method): 

nhưng thay vì:

def test_enter_promotion(self): 

http://www.voidspace.org.uk/python/mock/patch.html#patch-object

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