python - Python 3如何为try编写单元测试,除了模块中的外部函数
问题描述
我想知道如何为try except
在 Python 模块中的函数定义之外定义的块编写 Python 3 单元测试。
想象一下,package/module.py
我有一段代码,例如:
导入操作系统
try:
CONSTANT = os.environ['NOT_EXISTING_KEY']
except KeyError:
CONSTANT = False
finally:
del os
(请不要介意实际代码,我知道我可以os.getenv('NOT_EXISTING_KEY', False)
在这种特定情况下使用,我感兴趣的是真正测试模块中的 try-except 块(函数外部)是否按预期运行。
如何编写一个单元测试来检查package.module.CONSTANT
是否设置为预期值?
在 unittest 文件(我使用 pytest)中,我有类似的内容:
from package.module import CONSTANT
def test_constant_true():
assert CONSTANT == 'expected_value'
测试如果 try 块正确执行,那么 CONSTANT 是否符合预期。
但是,我不知道如何模拟导入机制,以便 try 块中的 os.environ 引发异常,并且我可以测试 CONSTANT 是否设置为 False。
我怎样才能做到这一点?
解决方案
您可以使用monkeypatch
设置环境变量,但您必须重新加载模块才能使更改生效:
from importlib import reload
from package import module
def test_constant_true(monkeypatch):
monkeypatch.setenv('MY_KEY', '42')
reload(module)
assert module.CONSTANT == '42'
def test_constant_false():
reload(module)
assert not module.CONSTANT
鉴于以下内容package/module.py
:
import os
try:
CONSTANT = os.environ['MY_KEY']
except KeyError:
CONSTANT = False
推荐阅读
- javascript - 如何有条件地向一个类型添加多个值?
- nuxt.js - 如果没有缓存,则重定向到离线页面并使用 @nuxtjs/pwa 从离线页面重定向到主页
- html - 响应式移动设计html
- angular - 如何使用其他现有的角度组件在 Angular js 中添加网格
- wix - 使用 wix bundle 部署外部负载
- sql - DISTINCT 函数在我的 SQL 查询中不起作用
- frontend - 前端产品类别中的产品属性
- python-unittest - unittest 的路径设置
- java - 仅在调试模式下找到匹配
- transactions - 0x 交换错误,因为:错误:事务已被 EVM 还原