Long story short, I'm perfectly able to mock class method, when it's just that method that's replaced by mock object, but I'm unable to mock that method when I'm trying to replace the whole class by the mock object
The @mock.patch.object successfully mocks the scan method but @mock.patch fails to do so. I've followed the example at https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch but apparently I'm doing something wrong.
I'm mocking the lexicon module in the same namespace in both cases (it's imported by import lexicon in the sentence_parser) but the mock_lexicon is lexicon.lexicon check fails
#!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() Output :
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 :
To clarify, the Parser is defined as follows
#!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;
lexiconmodule at github.com/bitprophet/lexicon/tree/master/lexicon and seams to me the class isLexiconinsteadlexicon; 2) my guess is that you have anotherlexiconmodule and not just the one inD:\python\lexicon; 3) why do you need;at the end of the lines ?lexiconis my own module that just happens to have the same name as the one you linked; 2) I have only two files inD:\python\lexiconone islexicon.pyand second one istest_lexicon.pycontaining unittests; 3) The;are just something I got used to in other languages, but that's not really relevant here