2011-12-12 1 views
45

Sto provando a prendere in giro qualcosa mentre collaudo un'app Django usando l'immaginativo Mock testing library. Io non riesco a ottenere abbastanza farlo funzionare, sto cercando di fare questo:Utilizzo della patch fittizia per simulare un metodo di istanza

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

Che cosa sto facendo di sbagliato?

+0

'' 'bar''' è infatti un "metodo di istanza," e il suo unico parametro è' '' self' ''. Per essere un metodo di classe, dovrebbe essere parametrizzato con '' 'cls''', e sarebbe chiamabile come' '' Promotion.foo() '' '. – cavaunpeu

+0

oggetto patchable ha bisogno di essere citato in questo modo: '@ patch.object ('my_app.models.FooClass', 'bar')' – Lasma

+0

@cavaunpeu - non (solo) con parametri con 'cls', ma ancora più importante (dal 'self' e' cls' non significano nulla di speciale in python), decorato con '@ classmethod' – dwanderson

risposta

21

Ah Sono stato confuso su dove applicare quel decoratore di patch. Risolto:

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

Dove si effettua la connessione tra il metodo di simulazione e la falsa implementazione ora? – physicalattraction

27

Per aggiungere sulla risposta di Kit, specificando un terzo argomento per patch.object() consente all'oggetto/metodo di deriso da specificare. In caso contrario, viene utilizzato un oggetto MagicMock predefinito.

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! 

Si noti che, se si specifica l'oggetto di scherno, l'impostazione predefinita è MagicMock()non è più passato nell'oggetto patch - per esempio non più:

def test_enter_promotion(self, mock_method): 

ma invece:

def test_enter_promotion(self): 

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