2012-04-23 14 views
22
def f1(): 
    return 10, True 

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

Jak używać mock biblioteki Pythona załatać f1() i zwrócić wynik niestandardowy więc mogłem przetestować f2()?Python mock łata funkcją wewnątrz innej funkcji

Edytowane: Czy coś jest nie tak z moim testem? To nie wydaje się działać, wszystkie testy nie powiodło się z 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)) 

Odpowiedz

11

Pierwszy przykład sugeruje, że f1() i f2() zdefiniowane w tym samym module. Stąd dodaje powinno działać:

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

Patch jest on taki sam jak import: @patch('foo.bar.f1')

o to dobra odpowiedź na ten problem:

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

+1

Dziękujemy za polecenie linku http://bhfsteve.blogspot.nl na temat łatania i importowania stylów. To rozwiązało jeden z moich problemów. – HeyWatchThis

17

Zakładając, że używasz tej mock libary:

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) 

Jeśli kod jest podzielony na moduły, to prawdopodobnie potrzebujesz zastąpić __main__.f1 ścieżką do twojego modułu/funkcji.

+0

miałoby to żadnego znaczenia, czy f1() akceptuje argumenty? E.g: f1 (arg) –

+0

Funkcja szydercza może być wywołana z dowolną liczbą argumentów, zawsze zwróci 'return_value'. –

+0

Wielkie dzięki @Secator. Zaktualizowałem moje pytanie za pomocą przypadku testowego i wydaje się, że nie przechodzi ono dalej. Co ja robię źle? –

Powiązane problemy