分享
三行代码  ›  专栏  ›  技术社区  ›  Anton Pilyak

Mock在Python 2.7的unittest中不起作用

  •  0
  • Anton Pilyak  · 技术社区  · 1 周前

    我的项目结构如下:

    py_test
       |
       +---my_module
       |    |  
       |    +--- __init__.py (empty)
       |    |
       |    +--- futil.py
       |
       +---test
            |
            +--- __init__.py (empty)
            |
            +--- futil_test.py
    

    无用的.py 我有以下资料:

    from os import path
    
    
    def check_exists(file_path):
        return path.exists(file_path)
    

    futil_test.py测试 我试图实现这样的单元测试:

    import mock
    import unittest
    
    from my_module.futil import check_exists
    
    
    class TestExists(unittest.TestCase):
    
        @mock.patch('my_module.futil.os.path')        # <---leads to error, as well as my_module.os.path
        def test_exists(self, mock_path):
            mock_path.exists.return_value = True
            self.assertTrue(check_exists('ba'))
    
    
    if __name__ == '__main__':
        unittest.main()
    

    当我尝试启动单元测试时,它失败并出现错误:

    Error
    Traceback (most recent call last):
      File "/usr/lib64/python2.7/unittest/case.py", line 367, in run
        testMethod()
      File "/home/antonio/devel/py/py_test/venv/lib/python2.7/site-packages/mock/mock.py", line 1322, in patched
        arg = patching.__enter__()
      File "/home/antonio/devel/py/py_test/venv/lib/python2.7/site-packages/mock/mock.py", line 1378, in __enter__
        self.target = self.getter()
      File "/home/antonio/devel/py/py_test/venv/lib/python2.7/site-packages/mock/mock.py", line 1548, in <lambda>
        getter = lambda: _importer(target)
      File "/home/antonio/devel/py/py_test/venv/lib/python2.7/site-packages/mock/mock.py", line 1235, in _importer
        thing = _dot_lookup(thing, comp, import_path)
      File "/home/antonio/devel/py/py_test/venv/lib/python2.7/site-packages/mock/mock.py", line 1224, in _dot_lookup
        __import__(import_path)
    ImportError: No module named os
    

    在这个例子中 here 类似的建设似乎也在起作用。我做错什么了?

    1 回复  |  直到 1 周前
        1
  •  1
  •   Hussain Bohra    1 周前

    “从操作系统导入路径”,将使路径功能成为futil的一部分。与其嘲笑“my_module.futil.os.path”,不如嘲笑“my_module.futil.path”,这样应该行得通。

    我发现这篇文章过去很有用 http://alexmarandon.com/articles/python_mock_gotchas/