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


82

상상적으로 명명 된 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))

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


bar사실은 "인스턴스 메소드"이며 유일한 매개 변수는 self입니다. 클래스 메서드가 되려면로 매개 변수화해야 cls하며 Promotion.foo().
cavaunpeu 2015 년

패치 가능한 개체는 다음과 같이 인용되어야합니다. @patch.object('my_app.models.FooClass', 'bar')
Lasma

2
@cavaunpeu -하지 (단지)와 파라미터 cls(이후 더 중요하지만, self그리고 cls파이썬되지 평균 아무것도 특별 할), 장식@classmethod
dwanderson

답변:


67

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


이 구현을 선호합니다. 특히 단위 테스트의 초보자에게 더 명확합니다.
Dorcioman

35

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

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

20
지금 모의 방법과 가짜 구현 사이의 연결은 어디입니까?
physicalattraction

@physicalattraction, 연결은 mock_method테스트 함수에 전달 된 인수에 의해 이루어집니다 . 내 테스트 중 하나에서이 기술을 사용할 수있었습니다. 이것은 mocked 메서드가 호출되었는지 확인하려는 경우에만 유용합니다.
Kalyan Vedala

@ rcode74 : 테스트 메서드 내에서 (다른 개체) 인스턴스의 메서드를 패치하는 방법. 예 : def my_method_to_be_tested (...) : r = some_script.some_class (...); r.how_to_patch_this_method.
imsrgadich

1
@imsrgadich, r.how_to_patch_this_method = MagicMock ()과 같은 작업을 수행합니다. MagicMock 문서에서 모의 ​​객체에 동작을 할당하는 방법을 확인할 수 있습니다.
Kalyan Vedala
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.