如何使用pytest模拟os.environ?

3

我希望在使用pytest框架编写的单元测试中模拟os.environ。

以下是我想要测试的代码的虚拟版本,位于getters.py中:

import os

username = os.environ['MY_USER']
password = os.environ['MY_PASS']

def get_data(...):

    access_token = request_access_token(username, password)
    ...
    return data

下面是 test_getters.py 文件中单元测试的一个示例:

import pytest
import src.getters

class TestGetData(object):


    def test_something(self):

        data = src.getters.get_data(...)

        assert ...

测试集合出现以下错误:

=========================== short test summary info ============================
ERROR tests/test_getters.py - KeyError: 'MY_USER'
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
=============================== 1 error in 0.68s ===============================

我希望您能够为整个测试类进行一次模拟,如果可能的话。是否有某种可以使用的装饰器?或者其他推荐的mocking os.environ的方法?请注意不要解释,并保留HTML标签。

如果os.environ['MY_USER']在函数get_data内访问,那么这个方法是可行的。但是,如果它首先在全局变量中定义并从函数中访问该全局变量,这种解决方案将无法工作。是否有其他解决方案? - undefined
1个回答

5

使用Monkeypatchingmonkeypatch.setenv()

文档:

修改测试环境变量。例如:测试程序在环境变量缺失时的行为,或者将多个值设置为已知变量。可以使用 monkeypatch.setenv() 和 monkeypatch.delenv() 进行这些补丁。

代码:

import pytest
import src.getters

class TestGetData(object):


    def test_something(self):
        monkeypatch.setenv('MY_USER', 'Nanna')
        monkeypatch.setenv('MY_PASS', 'P@ssw0rd')
        data = src.getters.get_data(...)

        assert ...

1
看起来正是我所需要的,谢谢!它也适用于类级别吗? - undefined
1
据我所知,这应该不是个问题,你甚至可以在 conftest.py 中设置它。 - undefined
2
如果在函数get_data内部访问os.environ['MY_USER'],那么这个方法是有效的。但是,如果它首先在全局变量中定义,并且从函数中访问该全局变量,那么这个解决方案就不起作用了。是否有其他解决方案? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接