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
。谢谢!这正是我要找的。