2015-02-11 2 views
0

Большинство советов по поводу издевательств на 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 

Что необходимо сделать, чтобы это повлияло на рамки единичного тестирования?

+0

Извините, я не могу воспроизвести вашу проблему. Попытайтесь использовать 'self.assertEqual (tmp.method_2(), 'test-val-1')' вместо 'assert ....', чтобы узнать, в чем разница. Насколько я вижу, он должен работать отлично ... Я использую 'mock' в' unittesting' довольно интенсивно во многих версиях python (2.7, 3.2 и 3.4) без каких-либо проблем, подобных этим. –

+0

Спасибо. Я исправляю свой единичный тестовый код так же, как вы просите, и я делаю другие небольшие изменения, чтобы сделать вопрос более ясным. У меня есть несколько примеров этой проблемы, используя разные фрагменты кода, собранные из Googleland. Я пишу на Python всего 3 месяца. Я парень Java, привыкший часто насмехаться в модульных тестах, и поэтому пытаюсь сбить его с Python. –

+0

Можете ли вы обновить вывод pyDev? Он по-прежнему ссылается на старый код, потому что в трассировке стека я читаю 'assert tmp.method_2() == 'test-val-1'' –

ответ

0

Ответ для меня, неофита Python и PyDev, заключается в том, что это проблема PyDev. PyDev кажется очень трогательным в отношении того, как настроено модульное тестирование проекта. Мне удалось создать этот код, вставив в него новый проект, настроенный именно так, включая отдельные файлы.

python-mocking 
+-- mocking_example 
    +-- test 
    | +-- __init__.py 
    | `-- test.py 
    +-- __init__.py 
    +-- bar.py 
    `-- foo.py 

Может быть, стоит отметить, что структура выше делает это так, что в test.py, бар должен быть импортирован, таким образом:

import mocking_example.bar 

и потребляется таким образом, то есть:

tmp = mocking_example.bar.Bar() 
+1

Я думаю, что ваша проблема связана с конфигурацией пути python для вашего проекта: если вы добавите 'mocking_example' в свой путь python, вы можете без проблем получить к нему доступ. –

+0

Да, спасибо, я вижу. Я не хотел влиять на переносимость моего проекта PyDev и сопротивлялся этому. Это отвечает на близкий вопрос: http://stackoverflow.com/questions/9249995/how-to-persist-pythonpath-setting-of-an-eclipse-pydev-project –

+1

Я вижу, что вы разработчик Java, и поэтому Eclipse это ваш дом, но я бы рекомендовал попробовать PyCharm ... это отличный инструмент! –

 Смежные вопросы

  • Нет связанных вопросов^_^