类级别的 mock.patch.dict - python 单元测试

Tos*_*far 2 python python-unittest

我有一个看起来像这样的字典,并且测试类中的所有方法都需要@mock.patch.dict它,有没有办法在类级别而不是在每个方法的顶部执行它。字典设置了一些os.environ变量,如下所示:

@mock.patch.dict('os.environ',
                 {'MSSQL_DB_NAME': 'tempdb', 
                  'MSSQL_USERNAME': 'sa', 
                  'MSSQL_PASSWORD': 'password',
                  'MSSQL_DSN': 'MYMSSQL'})
@mock.patch("commonutils.connectors.mssql.pyodbc")
def test_connectivity(self, my_pyodbc):
    self.db = Database(os.environ['MSSQL_DB_NAME'], 
                       os.environ['MSSQL_DSN'], 
                       os.environ['MSSQL_USERNAME'],
                       os.environ['MSSQL_PASSWORD'])
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以@mock.patch.dict在您TestCase的类级别使用装饰器:

import unittest
import unittest.mock
import os


@unittest.mock.patch.dict('os.environ', { 'VAR': '1' })
class MyTestCase1(unittest.TestCase):

    def test_feature_one(self):
        self.assertEqual(os.environ['VAR'], '1')

if __name__ == '__main__':
        unittest.main()
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用 setUp,您可以将其修补setUp

import unittest
import unittest.mock
import os


class MyTestCase1(unittest.TestCase):

    @unittest.mock.patch.dict('os.environ', { 'VAR': '1' })
    def setUp(self):
        print(os.environ['VAR'])
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此处的第二种形式(在 setUp 上进行修补)不会执行您想要的操作。我很怀疑,所以尝试了一下并验证了当 setUp 方法完成时(在测试实际开始之前)它会立即“取消修补”它。 (4认同)