我希望能够在Django应用程序中设置环境变量,以便测试能够运行。例如,我的视图依赖于几个API键。
有一些方法可以override settings during testing,但我不希望在settings.py
中定义它们,因为这是一个安全问题。
我在setup函数中尝试设置这些环境变量,但这无法为Django应用程序提供值。
class MyTests(TestCase):
def setUp(self):
os.environ['TEST'] = '123' # doesn't propogate to app
当我在本地测试时,我只需要使用一个.env
文件
foreman start -e .env web
它为os.environ
提供值。但在Django的unittest.TestCase
中,它没有一种(我知道的)设置方法。
我怎么能避开这个?
正如@schillingt在评论中指出的,EnvironmentVarGuard是正确的方式。
这将在上下文对象
with
语句的持续时间内正确设置环境变量。test.support.EnvironmentVarGuard
是一个内部API,可以通过中断(向后不兼容)更改从一个版本更改到另一个版本。事实上,整个test
包只供内部使用。在测试包文档页上明确声明,它用于核心库的内部测试,而不是公共API。(见下面的链接)您应该在python的标准库中使用^{} 。它可以用作上下文管理器、装饰器或类装饰器。请参阅下面从正式Python文档复制的示例代码。
更新:对于那些没有完全阅读文档并且可能错过了注释的人,请阅读更多的
test
包注释https://docs.python.org/2/library/test.html或
https://docs.python.org/3/library/test.html
使用
EnvironmentVarGuard
不是一个好的解决方案,因为它在某些环境中失败,在另一些环境中工作。请参见下面的示例。一个更好的解决方案是erewok所建议的,它需要利用python3中的
unittest.mock
。假设使用unittest
```
相关问题 更多 >
编程相关推荐