gpt4 book ai didi

Python:模拟修补模块,无论它是从哪里导入的

转载 作者:行者123 更新时间:2023-11-28 17:27:48 26 4
gpt4 key购买 nike

我需要确保运行单元测试不会触发调用繁重的外部世界函数,比如这个函数:

# bigbad.py
def request(param):
return 'I searched the whole Internet for "{}"'.format(param)

多个模块使用这个函数 (bigbad.request) 并且它们以不同的方式导入它(在现实生活中它也可能从外部库导入)。比如说,有两个模块 a 和 b,其中 b 依赖于 a 并且都使用函数:

# a.py, from...import
from bigbad import request

def routine_a():
return request('a')

# b.py, imports directly
import a
import bigbad

def routine_b():
resp_a = a.routine_a()
return 'resp_a: {}, resp_b=request(resp_a): {}'.format(resp_a, bigbad.request(resp_a))

有没有办法确保永远不会调用 bigbad.request?此代码仅模拟其中一个导入:

# test_b.py
import unittest
from unittest import mock
import b

with mock.patch('bigbad.request') as mock_request:
mock_request.return_value = 'mocked'
print(b.routine_b())

显然我可以重构 b 并更改导入,但这样我不能保证在未来的开发过程中有人不会破坏这个规定。我认为测试应该测试行为而不是实现细节。

最佳答案

import bigbad
bigbad.request = # some dummy function

只要它在执行 from bigbad import request 的任何模块运行/导入之前运行,它就会起作用。也就是说,只要他们追上去,就会收到dummy函数。

关于Python:模拟修补模块,无论它是从哪里导入的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37297265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com