【发布时间】:2021-01-21 04:11:59
【问题描述】:
我想在 Python 中对以下函数进行单元测试:
def get_params(env, secret_fetcher):
try:
url = env['API_URL']
except KeyError:
raise
try:
key = secret_fetcher.get_secret('CLIENT-KEY')
secret = secret_fetcher.get_secret('CLIENT-SECRET')
except:
raise
return url, key, secret
它从环境中读取一个参数,同时使用 KeyVault 类 secret_fetcher 的对象从密钥库中检索另外两个参数。我在我的主函数中调用它,如下所示:
secret_fetcher = SecretFetcher(vault_url)
url, key, secret = get_params(os.environ, secret_fetcher)
我正在为此功能编写单元测试。对于env,我在测试中使用字典。但是,在要测试的函数内部调用其成员函数的函数的第二个参数该怎么办?
class TestApp():
def test_get_params(self):
env = {'WrongField': 'http://test.com/123'}
<mock secret_fetcher>
self.assertRaises(KeyError, get_params, env, secret)
我是模拟secret_fetcher 还是secret_fetcher.get_secret?特别是当 get_secret 在输入不同的参数时返回不同的值时。我是否应该模拟 SecretFetcher 类并实现一个函数 get_secret 以返回具有这两个不同值的参数的预期输出?
【问题讨论】:
-
如果您只是在测试
get_params,我不确定您为什么要测试ValueError,因为它不是由get_params提出的。我要做的唯一测试是确保使用unittest.mock.Mock实例使用适当的参数调用secret_fetcher.get_secret。 -
但是,如果您将
raise行更改为raise ValueError(并且可能限制except行以捕获特定的异常类型),那么您应该提供一个模拟secret_fetcher.get_secret引发适当的异常。 -
详情请咨询this thread。
-
@metatoaster 我打算测试 assertRaises(KeyError... 那是一个错误
标签: python unit-testing mocking patch