J'essaie de me moquer de quelque chose en testant une application Django en utilisant le nom imaginatif bibliothèque de tests Mock . Je n'arrive pas à le faire fonctionner, je ' m essayant de le faire:
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))
Qu'est-ce que je fais mal?
Ah, je ne savais pas trop où appliquer ce patch décorateur. Fixé:
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))
Pour compléter la réponse de Kit, la spécification d'un troisième argument à patch.object()
permet de spécifier l'objet/la méthode simulée. Sinon, un objet MagicMock
par défaut est utilisé.
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!
Notez que, si vous spécifiez l'objet fantaisie, la MagicMock()
par défaut ( n'est plus transmise à l'objet patché - par ex. plus maintenant:
def test_enter_promotion(self, mock_method):
mais plutôt:
def test_enter_promotion(self):
http://www.voidspace.org.uk/python/mock/patch.html#patch-object