Es gibt zwei Möglichkeiten, wie Sie dies tun können. mit patch und mit patch.object
Patch geht davon aus, dass Sie das Objekt nicht direkt importieren, sondern dass es von dem zu testenden Objekt wie im Folgenden verwendet wird
def some_fn():
return 'some_fn'
class Foo(object):
def method_1(self):
return some_fn()
import foo
class Bar(object):
def method_2(self):
tmp = foo.Foo()
return tmp.method_1()
import bar
from mock import patch
@patch('foo.some_fn')
def test_bar(mock_some_fn):
mock_some_fn.return_value = 'test-val-1'
tmp = bar.Bar()
assert tmp.method_2() == 'test-val-1'
mock_some_fn.return_value = 'test-val-2'
assert tmp.method_2() == 'test-val-2'
Wenn Sie das zu testende Modul direkt importieren, können Sie patch.object wie folgt verwenden:
import foo
from mock import patch
@patch.object(foo, 'some_fn')
def test_foo(test_some_fn):
test_some_fn.return_value = 'test-val-1'
tmp = foo.Foo()
assert tmp.method_1() == 'test-val-1'
test_some_fn.return_value = 'test-val-2'
assert tmp.method_1() == 'test-val-2'
In beiden Fällen wird some_fn nach Abschluss der Testfunktion nicht verspottet.
Bearbeiten: Um mehrere Funktionen zu verspotten, fügen Sie der Funktion einfach weitere Dekoratoren hinzu und fügen Sie Argumente hinzu, um die zusätzlichen Parameter zu übernehmen
@patch.object(foo, 'some_fn')
@patch.object(foo, 'other_fn')
def test_foo(test_other_fn, test_some_fn):
...
Beachten Sie, dass der Dekorator umso früher in der Parameterliste steht, je näher er an der Funktionsdefinition liegt.