2011-12-12 16 views
45

Próbuję wyśmiać coś podczas testowania aplikacji Django przy użyciu nazwy użytkownika o nazwie Mock testing library. Nie wydaje mi się, żeby to działało, próbuję to zrobić:Używanie makiety do kpiny z metody instancji

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)) 

Co robię źle?

+0

'' 'bar''' w rzeczywistości jest "metoda instancji", a jego jedynym parametrem jest' '' self' ''. Aby być metodą klasową, musiałaby być sparametryzowana za pomocą '' 'cls''' i mogłaby być wywołana jako' 'Promotion.foo()' ''. – cavaunpeu

+0

Obiekt do patchowania musi być cytowany w ten sposób: '@ patch.object ('my_app.models.FooClass', 'bar')' – Lasma

+0

@cavaunpeu - nie (just) sparametryzowany przez 'cls', ale co ważniejsze (ponieważ 'self' i' cls' nie mają nic szczególnego w pythonie), ozdobione '@ classmethod' – dwanderson

Odpowiedz

21

Ah Nie wiedziałem, gdzie zastosować ten dekorator płatków. Poprawiono:

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

Gdzie teraz tworzysz połączenie pomiędzy metodą do fałszywej implementacji? – physicalattraction

27

Aby dodać na odpowiedź Kita, określając 3rd argumentu patch.object() pozwala szydzili obiekt/metoda zostać określona. W przeciwnym razie używany jest domyślny obiekt MagicMock.

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! 

zauważyć, że jeśli podasz obiekt szyderczy, a następnie domyślny MagicMock() jest nie przeszedł do poprawionego obiektu - na przykład nie:

def test_enter_promotion(self, mock_method): 

ale zamiast:

def test_enter_promotion(self): 

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

Powiązane problemy