7

有一些 Python 代码可以在 Linux 下运行。它以如下方式使用 pwd 模块:

import pwd
   ...
  def func():
      user=pwd.getpwnam(user)[2]

现在我们特别需要用测试覆盖这段代码,并且测试必须在 Windows 下运行。该程序本身旨在仅在 Linux 下运行。问题是 pwd 模块在 Windows 下不可用,因此即使使用 MagicMock 模拟了 pwd 函数的实现,被测代码也会因 ImportError 而失败。

解决这个问题的基本思路是在运行测试时隐藏 pwd 模块。因此,在运行测试时,存根将隐藏 pwd,而在运行主程序时,将使用原始(Unix)pwd。我们在测试 PYTHONPATH 中创建了这样的存根:

# pwd.py
def getpwnam(user):
    print("YESSSSSSSS")

但它似乎没有隐藏 pwd 模块,在调试器中我们看到内置 pwd 已导入。我主要是一名Java开发人员,所以如果做事方式不是“pythonic”,我很抱歉。欢迎提出想法。

4

2 回答 2

15

将您的名称重命名pwd.py为其他名称,例如winpwd.py. 然后使用:

try:
    import pwd
except ImportError:
    import winpwd as pwd

通过这种方式导入,您将在 Linux 和Windows上pwd获得内置。然后,您应该能够随心所欲地运行测试和模拟它。pwdwinpwd

于 2013-05-13T18:59:37.700 回答
6
import os
if os.name == 'nt':
    class Pwd():
        def getpwnam(self, user):
            pass
    pwd = Pwd()
else:
    import pwd

类似的东西可以工作吗?项目中不需要额外的 .py 文件。
我自己用过fchown几次...

于 2013-05-13T18:59:45.143 回答