복붙노트

[PYTHON] 파이썬 모의는 다른 함수 내의 함수를 패치한다.

PYTHON

파이썬 모의는 다른 함수 내의 함수를 패치한다.

def f1():
    return 10, True

def f2():
    num, stat = f1()
    return 2*num, stat

파이썬의 모의 라이브러리를 사용하여 f1 ()을 패치하고 f2 ()를 테스트 할 수 있도록 사용자 정의 결과를 반환하려면 어떻게해야합니까?

편집 됨 : 내 검사에 문제가 있습니까? 이것은 작동하지 않는 것 같습니다. AssertionError로 모든 테스트가 실패했습니다.

from foo.bar import f2
from mock import patch

class MyTest(TestCase):

    def test_f2_1(self):
        with patch('project.module.f1') as some_func:
            some_func.return_value = (20, False)
            num, stat = f2()
            self.assertEqual((num, stat), (40, False))

   @patch('project.module.f1')
   def test_f2_2(self, some_func):
       some_func.return_value = (20, False)
       num, stat = f2()
       self.assertEqual((num, stat), (40, False))

해결법

  1. ==============================

    1.첫 번째 예제는 f1 ()과 f2 ()가 동일한 모듈에 정의되어 있음을 나타냅니다. 따라서 다음과 같이 작동해야합니다.

    첫 번째 예제는 f1 ()과 f2 ()가 동일한 모듈에 정의되어 있음을 나타냅니다. 따라서 다음과 같이 작동해야합니다.

    from foo.bar import f2
    from mock import patch
    
    class MyTest(TestCase):
    
        @patch('foo.bar.f1')
        def test_f2_2(self, some_func):
            some_func.return_value = (20, False)
            num, stat = f2()
            self.assertEqual((num, stat), (40, False))
    

    패치는 import와 동일합니다 : @patch ( 'foo.bar.f1')

    이 문제에 대한 좋은 대답은 다음과 같습니다.

    http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

  2. ==============================

    2.이 모의 라이브러리를 사용하고 있다고 가정합니다.

    이 모의 라이브러리를 사용하고 있다고 가정합니다.

    def f1():
        return 10, True
    
    def f2():
        num, stat = f1()
        return 2*num, stat
    
    import mock
    
    print f2()   # Unchanged f1 -> prints (20, True)
    
    with mock.patch('__main__.f1') as MockClass:       # replace f1 with MockClass 
        MockClass.return_value = (30, True)     # Change the return value
    
        print f2()     # f2 with changed f1 -> prints (60, True)
    

    코드가 모듈로 나누어 져 있다면 __main __. f1을 모듈 / 함수의 경로로 바꿔야 할 것입니다.

  3. from https://stackoverflow.com/questions/10277397/python-mock-patch-a-function-within-another-function by cc-by-sa and MIT license