如果无法加载可选库,则创建模拟库-可以接受的做法吗?

时间:2019-05-19 13:30:46

标签: python python-3.x mocking

如果要使用该软件包,我想使用colored在Python 3.6中进行打印,如下所示:

print('{}Hello, world!{}'.format(colored.fg(1), colored.attr(0)))

但是,我希望在可能的情况下将colored设置为可选,同时仍然打印任何可以样式化的文本。由于可以使用colored的多种方式(例如colored.stylize()并一起添加颜色),仅创建用于打印的包装函数似乎是不够的。

cheerful = colored.fg('cyan') + colored.attr('bold')
print(colored.stylize("Hello, world!", cheerful, colored.attr("underlined"))

尽管通常使用模拟来进行测试,但是在没有可选库的情况下创建要使用的模拟库是否可以接受??在名为colored_mock的模块中进行类似的操作(按照in this question的说明进行模拟):

from unittest.mock import Mock
import sys
import types

module_name = 'mock_colored'
mock_colored = types.ModuleType(module_name)
sys.modules[module_name] = mock_colored

# following the original definition
def stylize(string, styles, reset=True):
    # return the original string so it can be used
    return string

mock_colored.stylize = Mock(name=module_name+'.stylize', side_effect=stylize)

# and so on until most of the module attributes and functions are covered

我可以这样做:

try:
   import colored
except ImportError:
    from .mock_colored import mock_colored as colored

1 个答案:

答案 0 :(得分:0)

使用Mock表示您正在测试。如果这是您自己的代码,则最好为stylized以及您要导入的任何其他colored方法使用包装器:

colored_imported = False
try:
    import colored
    colored_imported = True
except ImportError: 
    pass

def stylized(string, styles, reset=True):
    if colored_imported:
        return colored.stylized(string, styles, reset=reset)
    else:
        return string

这将有助于发现由于拼写错误的方法(例如stylised)或参数太少而引起的问题。这种方法还应该使您的代码更易于理解和调试。