Большинство советов по поводу издевательств на Python заключаются в короткие фрагменты за пределами модульной тестовой среды. Это работает, я пытаюсь следовать этому совету, но это не удается, как только я встрою его в правильный модульный тест. Например, это какой код производит вывод в комментарии в конце:Как использовать 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) без каких-либо проблем, подобных этим. –
Спасибо. Я исправляю свой единичный тестовый код так же, как вы просите, и я делаю другие небольшие изменения, чтобы сделать вопрос более ясным. У меня есть несколько примеров этой проблемы, используя разные фрагменты кода, собранные из Googleland. Я пишу на Python всего 3 месяца. Я парень Java, привыкший часто насмехаться в модульных тестах, и поэтому пытаюсь сбить его с Python. –
Можете ли вы обновить вывод pyDev? Он по-прежнему ссылается на старый код, потому что в трассировке стека я читаю 'assert tmp.method_2() == 'test-val-1'' –