Короче говоря, я отлично умею издеваться над методом класса, когда это только тот метод, который заменяется макетным объектом, но я не могу издеваться над этим методом, когда пытаюсь заменить целое класс от макета объектаОтказывание целого класса
@mock.patch.object
успешно издевается над методом scan
, но @mock.patch
не может этого сделать. Я следовал примеру на https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch , но, видимо, я делаю что-то неправильно.
Я насмешливо модуль лексикон в том же пространстве имен в обоих случаях (это импортируется import lexicon
в sentence_parser
), но mock_lexicon is lexicon.lexicon
проверка неудачна
#!python
import sys;
sys.path.append('D:\python\lexicon');
import lexicon;
import sentence_parser;
import unittest2 as unittest;
import mock;
class ParserTestCases(unittest.TestCase) :
def setUp(self) :
self.Parser = sentence_parser.Parser();
@mock.patch('lexicon.lexicon')
def test_categorizedWordsAreAssigned_v1(self, mock_lexicon) :
print "mock is lexicon:";
print mock_lexicon is lexicon.lexicon + "\n";
instance = mock_lexicon.return_value;
instance.scan.return_value = "anything";
self.Parser.categorize_words_in_sentence("sentence");
instance.scan.assert_called_once_with("sentence");
@mock.patch.object(lexicon.lexicon, 'scan')
def test_categorizedWordsAreAssigned_v2(self, mock_scan) :
mock_scan.return_value = "anything";
self.Parser.categorize_words_in_sentence("sentence");
mock_scan.assert_called_once_with("sentence");
if (__name__ == '__main__') :
unittest.main()
Выход:
mock is lexicon:
False
======================================================================
FAIL: test_categorizedWordsAreAssigned_v1 (__main__.ParserTestCases)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\python\get_img\getImage_env\lib\site-packages\mock\mock.py", line 1305, in patched
return func(*args, **keywargs)
File "./test_sentence_parser.py", line 26, in test_categorizedWordsAreAssigned_v1
instance.scan.assert_called_once_with("sentence");
File "D:\python\get_img\getImage_env\lib\site-packages\mock\mock.py", line 947, in assert_called_once_with
raise AssertionError(msg)
AssertionError: Expected 'scan' to be called once. Called 0 times.
----------------------------------------------------------------------
Ran 2 tests in 0.009s
FAILED (failures=1)
EDIT:
Для уточнения, Parser
определяется следующим образом:
#!python
import sys;
sys.path.append('D:\python\lexicon');
import lexicon;
class Parser(object) :
my_lexicon = lexicon.lexicon()
def __init__(self) :
self.categorized_words = ['test'];
def categorize_words_in_sentence(self, sentence) :
self.categorized_words = self.my_lexicon.scan(sentence);
if (__name__ == '__main__') :
instance = Parser();
instance.categorize_words_in_sentence("bear");
print instance.categorized_words;
Три вопроса: 1) Я посмотрел на 'модуль lexicon' на https://github.com/bitprophet/lexicon/tree/master/lexicon и швам мне класс' 'Lexicon' вместо lexicon'; 2) Я предполагаю, что у вас есть еще один модуль 'lexicon', а не только тот, который находится в' D: \ python \ lexicon'; 3) зачем вам нужно ';' в конце строк? –
1) 'lexicon' - мой собственный модуль, который просто имеет то же имя, что и тот, который вы связали; 2) У меня только два файла в 'D: \ python \ lexicon' one -' lexicon.py', а второй - 'test_lexicon.py', содержащий unittests; 3) ';' - это только то, к чему я привык на других языках, но здесь это не так актуально. – krzym1