2014-03-31 20 views
0

我試圖在導入兩個其他模塊的類上運行單元測試,並試圖使用mock修補這些模塊。其中一個模塊在我正在測試的類中實例化,而我無法修補它。看來我已經設法修補另一個。修補在SUT中導入和實例化的模塊

在此代碼中修補sequence.processor模塊的最佳方法是什麼?

目錄結構

logger.py 
parser/ 
    __init__.py 
    docparser.py 
sequence/ 
    __init__.py 
    processor.py 
tests/ 
    testdocparser.py 

/parser/docparser.py

import logger 
from sequence.processor import Processor 

class DocParser(object): 
    def __init__(self, reader_writer): 
     self.processor = Processor(reader_writer) 

    def write_and_parse(self, products): 
     logger.log(products) 
     self.processor.process(products) 

/tests/testdocparser.py

import unittest 
from mock import MagicMock, patch 

from parser import docparser 

class DocParserTests(unittest.TestCase): 
    def setUp(self): 
     self.mock_writer = MagicMock() 
     self.docparser = docparser.DocParser(self.mock_writer) 

    @patch("parser.docparser.logger") # This seems to be patched properly 
    @patch("parser.docparser.Processor") # This is not patched 
    def test_write_and_parse(self, mock_logger, mock_proc): 
     products = "products" 
     self.docparser.write_and_parse(products) 

回答

1

您在test_write_and_parse()中修補Processor,但它在DocParser.__init__()中實例化,它從setUp()調用。

這應該工作,雖然我沒有測試它:

class DocParserTests(unittest.TestCase): 
    def setUp(self): 
     self.mock_writer = MagicMock() 
     with patch('parser.docparser.Processor'): 
      self.docparser = docparser.DocParser(self.mock_writer) 

    @patch("parser.docparser.logger") 
    def test_write_and_parse(self, mock_logger): 
     products = "products" 
     self.docparser.write_and_parse(products) 

我使用情況管理器,而不是裝飾,以避免改變setUp()簽名(添加參數)。

此外,test_write_and_parse()的模擬參數順序在您的代碼中不正確。下面是mock docs的摘錄:

當你窩補丁裝飾的嘲笑在傳遞給裝飾功能在他們申請(正常蟒蛇爲了裝飾應用)的順序相同。這意味着,從下往上...

正確的順序:

@patch("parser.docparser.logger") # This seems to be patched properly 
@patch("parser.docparser.Processor") # This is not patched 
def test_write_and_parse(self, mock_proc, mock_logger): 
    # ... 

五言中,它並沒有真正在你的具體情況不要緊,因爲mock_procmock_logger不是以後使用。

+0

謝謝!這正是我正在尋找的。 – Plasma