[python] 모의 패치를 사용하여 인스턴스 메서드 모의

상상적으로 명명 된 Mock testing library를 사용하여 Django 앱을 테스트하는 동안 무언가를 조롱하려고합니다 . 제대로 작동하지 않는 것 같습니다. 이렇게하려고합니다.

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

내가 도대체 ​​뭘 잘못하고있는 겁니까?



답변

Kit의 답변에 추가하려면 patch.object()모의 객체 / 메소드를 지정할 수 있도록 세 번째 인수를 지정합니다. 그렇지 않으면 기본 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!

모의 객체를 지정하면 기본값 MagicMock()더 이상 패치 된 객체에 전달되지 않습니다. 예를 들어 더 이상 :

def test_enter_promotion(self, mock_method):

대신 :

def test_enter_promotion(self):

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


답변

아, 패치 데코레이터를 어디에 적용해야하는지 혼란 스러웠습니다. 결정된:

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


답변