web-dev-qa-db-fra.com

Utilisation d'un correctif factice pour simuler une méthode d'instance

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?

67
Kit Sunde

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))
30
Kit Sunde

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

54
storm_m2138