Python 修补SUT中导入和实例化的模块

Python 修补SUT中导入和实例化的模块,python,unit-testing,mocking,python-import,Python,Unit Testing,Mocking,Python Import,我尝试在一个导入了另外两个模块的类上运行单元测试,并尝试使用mock修补这些模块。其中一个模块是在我正在测试的类中实例化的,我还不能修补它。看来我已经设法解决了另一个问题 修补此代码中的序列.处理器模块的最佳方法是什么 目录结构 logger.py parser/ __init__.py docparser.py sequence/ __init__.py processor.py tests/ testdocparser.py /parser/docp

我尝试在一个导入了另外两个模块的类上运行单元测试,并尝试使用
mock
修补这些模块。其中一个模块是在我正在测试的类中实例化的,我还不能修补它。看来我已经设法解决了另一个问题

修补此代码中的
序列.处理器
模块的最佳方法是什么

目录结构

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)
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)
/tests/testdocparser.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)
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)

您可以在
test\u write\u和
中修补
处理器
,但它在
DocParser中实例化。
初始化
,从
设置()调用

这应该可以,尽管我还没有测试过:

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)
我使用了上下文管理器而不是decorator来避免更改
setUp()
签名(添加参数)

代码中test_write_和_parse()的模拟参数顺序也不正确。以下是一段摘录:

当您嵌套补丁装饰器时,模拟将按照它们应用的相同顺序(装饰器应用的正常python顺序)传递给装饰函数。这意味着从下到上

正确的顺序:

@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\u proc
mock\u logger

谢谢!这正是我要找的。