Большинство советов по насмешкам Python изложены в виде коротких фрагментов, выходящих за рамки модульного тестирования. Это работает, я пытаюсь следовать этому совету, но это не удается, как только я вставляю его в правильный модульный тест. Например, этот код, который выводит вывод в конце комментария:
# foo.py
def some_fn():
return 'some_fn'
class Foo( object ):
def method_1( self ):
return some_fn()
# bar.py (depends on foo.py)
import foo
class Bar( object ):
def method_2( self ):
tmp = foo.Foo()
return tmp.method_1()
# test.py (tests bar.py)
import unittest
import bar
from mock import patch
class Test( unittest.TestCase ):
def setUp( self ):
pass
def tearDown( self ):
pass
@patch( 'foo.some_fn' )
def test_bar( self, mock_some_fn ):
mock_some_fn.return_value = 'test-val-1'
tmp = bar.Bar()
print tmp.method_2()
self.assertEqual( tmp.method_2(), 'test-val-1' ) # line 32
mock_some_fn.return_value = 'test-val-2'
self.assertEqual( tmp.method_2(), 'test-val-2' )
if __name__ == "__main__":
unittest.main()
Который я запускаю в PyDev и вижу:
Finding files... done.
Importing test modules ... done.
some_fn
======================================================================
FAIL: test_bar (test.foo.all.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/mock.py", line 1201, in patched
return func(*args, **keywargs)
File "/home/russ/dev/workspace/python-mocking/test/foo/all.py", line 32, in test_bar
self.assertEqual( tmp.method_2(), 'test-val-1' )
AssertionError: 'some_fn' != 'test-val-1'
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (failures=1)
Удалите среду модульного тестирования, и этот код будет работать нормально (здесь только часть test.py всего файла):
...
# test.py (tests bar.py)
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()
print tmp.method_2()
assert tmp.method_2() == 'test-val-1'
mock_some_fn.return_value = 'test-val-2'
assert tmp.method_2() == 'test-val-2'
который успешно производит при запуске:
~/dev/workspace/python-mocking/test/foo $ python
Python 2.7.5 (default, Nov 3 2014, 14:26:24)
...
>>> import all0
>>> all0.test_bar()
test-val-1
Что еще я должен сделать, чтобы это работало в рамках модульного тестирования?
self.assertEqual(tmp.method_2(), 'test-val-1')
вместоassert ....
, чтобы увидеть, в чем разница. Насколько я вижу, он должен работать отлично... Я довольно интенсивно используюmock
вunittesting
во многих версиях Python (2.7, 3.2 и 3.4) без каких-либо проблем, подобных этим. - person Michele d'Amico   schedule 12.02.2015assert tmp.method_2() == 'test-val-1'
- person Michele d'Amico   schedule 12.02.2015python test.py
? Ставлю доллар, что это сработает. - person Michele d'Amico   schedule 12.02.2015patch
работает с правильным модулемfoo
... Есть ли какой-либо другой модульfoo
в вашем пути к Python? - person Michele d'Amico   schedule 12.02.2015test.py
, и введитеpython.exe test.py
... если не работает, заменитеpython.exe
полным путемpython.exe
. Кстати, я хотел бы отметить, что вы должны были что-то пропустить ... нет никакого способа воспроизвести это, вырезав и вставив ваш пример. - person Michele d'Amico   schedule 12.02.2015