代码之家  ›  专栏  ›  技术社区  ›  Jerinaw

如何测试立即运行的代码?

  •  2
  • Jerinaw  · 技术社区  · 7 年前

    使用Python的UnitTest框架,如何模拟或替换在加载模块时运行代码的模块?

    我知道这是写得不好的代码,但这与我必须测试的代码类似。(见例子)

    我知道一旦一个模块被导入,它就可以被修补以使用mock。但是如果有立即运行的代码呢?

    我有一个文件需要测试。它导入的其中一个文件立即运行代码,请参见示例。

    文件\u under \u test.py

    from somewhere.something.worker import a_func as f
    
    class ClassToTest():
        __init__(self):
    ...
    

    somewhere.something.worker模块

    import os
    import redis
    REDIS_HOST = os.environ.get('redishost', '') #<-- Mock this
    connection = redis.Redis(host=REDIS_HOST) #<--- Mock this
    
    class AClass():
        ...
    
    def a_func():
        connection.doSomething()
        ...
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   chepner    7 年前

    推迟创建连接,直到您真正做好准备。作为奖励,你可以 init_connection 采用可选的预分配连接,而不是总是按需创建。这使得向完全避免全局连接的方向迁移变得更加容易。

    import os
    import redis
    
    connection = None
    
    def init_connection(c=None):
        global connection
        if connection is None:
            if c is None:
                c = redis.Redis(host=os.environ.get('redishost', ''))
            connection = c
    
    ...
    

    然后,在您的测试模块中,您可以调用 接口连接 从内部 setupModule ,可以选择像对象一样传入所需的连接 不用修补任何东西。

    def setupModule():
        init_connection()
        # or
        # conn = Mock()
        # ... configure the mock ...
        # init_connection(conn)
    
    class ClassToTest():
        __init__(self):
    ...