在 python 个模块上使用 flexmock

Using flexmock on python modules

我一直在互联网上搜索以查找在 python 模块上使用 flexmock 的示例,但所有文档似乎都是针对 object/class 的。我想知道是否可以模拟模块返回的一些变量。如果该模块调用另一个模块怎么办?

例如

def function_inside_function(id, some_string):
    test_log = {"id": id, "definition": some_string}
    return test_log

def function1(id):
    some_string = 'blah' + id  # i am totally bs-ing here
    log = function_inside_function(id, some_string)
    return log

所以现在我想通过使用 flexmock 模拟一些值来分别测试每个函数

当时用一个对象做同样的事情时,我可以做(假设对象被分配为test_object

flexmock(test_object).should_receive('some_func').and_return('some_value')

其中 some_func 在该对象中被调用

但是当我尝试对模块执行相同操作时,我一直收到

FlexmockError: <function function1 at some_address> does not have attribute function_inside_function

我想知道是否可以在模块上使用 flexmock,如果可以的话。怎么样?

经过大量的研究和试错,原来我必须使用sys.modules

假设我的模块是从 path.to.module 导入的,那么语法将是

flexmock(sys.modules['path.to.module']).should_receive('function.of.object').and_return(response)

function.of.object 是被调用的函数。例如,requests.get。仅使用 get 是行不通的。

response 是您尝试模拟的响应。在 requests.get 示例中,响应将是 requests.Response(),然后如果 flexmock 抱怨它,您可以使用 setattr 来设置属性。 (有更好的方法吗?)