首页 > 解决方案 > 如何模拟 my_package.__path__?

问题描述

我想测试下面的类,并想知道如何模拟__path__一个包,以便我可以在if...else...控制流中测试这两个场景。

# my_module.py

import my_tools

Class First:
    def __init__(self):
        path = my_tools.__path__[0]
        if path.endswith(".zip"):
            self.a = 1
        else:
            self.a = 2 

以下是我的项目的文件结构。

.
└── source
    ├── my_tools
    │   └── my_module.py
    └── tests
        └── test_my_module.py

标签: pythontestingmocking

解决方案


由于__path__是一个模块属性,它应该被PropertyMockfrom模拟unittests.mock

# content of test_my_module.py
from unittests.mock import patch, PropertyMock
from tools.my_module import First

Class TestFirst:
    @patch("my_tools.my_module.my_tools")
    def test_first(self, mock):
        type(mock).__path__ = PropertyMock(return_value=["/fake/path.zip"]
        my_first = First()
        assert my_first.a == 1


推荐阅读