如何模拟模块python,补丁找不到属性



在我使用的uuid1中,我想修补。

def myFunction():
     my_value = uuid4.int
     smth else..

我希望能够模拟my_value,以便在我的单元测试中返回相同的数字,因为我需要进一步使用。我尝试做:

 @patch('folder.myFunction.uuid4')
 def test_myFunction(self, mock_value):
      mock_value.return_value = 22222

,但它引发了一个错误,说myfunction没有uuid4作为属性。

如何模拟其价值?

您获得的错误是正确的。您的功能没有uuid4属性。

我在线之间读取,假设uuid4是通常生成随机UUID的uuid模块的方法。

测试时,您说您希望它始终返回相同的值。为此,您可以用unittest.mock.Mock代替uuid.uuid4

In [36]: uuid_mock = Mock(return_value=uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b9f3e'))
In [37]: uuid_mock()
Out[37]: UUID('77f1df52-4b43-11e9-910f-b8ca3a9b9f3e')

类似的东西用于测试以下功能(f

import uuid, unittest
from unittest.mock import Mock, patch
def f():
    z = uuid.uuid4()
    return z.int

补丁的目标是uuid方法-uuid.uuid4。指定 patch new参数的固定返回值的unittest.mock.Mock。在测试期间,模拟将被替换为uuid.uuid4

class TestF(unittest.TestCase):
    uuid_mock = Mock(return_value=uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b9f3e'))
    good_uuid = uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b9f3e').int
    bad_uuid = uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b5a31').int
    @patch(target='uuid.uuid4', new=TestF.uuid_mock)
    def test_myFunction_True(self):
        self.assertEqual(f(), self.good_uuid)
    @patch(target='uuid.uuid4', new=TestF.uuid_mock)
    def test_myFunction_False(self):
        self.assertNotEqual(f(), self.bad_uuid)
if __name__ == '__main__':
    unittest.main()

结果:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK

如果要测试依赖f的返回值的函数,并且希望f在测试过程中始终返回相同的值,然后将f成为 patch patch patch 的目标。

def g():
    return f() == uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b9f3e').int
class TestG(unittest.TestCase):
    good_uuid_mock = Mock(return_value=uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b9f3e').int)
    bad_uuid_mock = Mock(return_value=uuid.UUID('77f1df52-4b43-11e9-910f-b8ca3a9b5a31').int)
    @patch(target='__main__.f', new=TestG.good_uuid_mock)
    def test_myFunction_True(self):
        self.assertTrue(g())
    @patch(target='__main__.f', new=TestG.bad_uuid_mock)
    def test_myFunction_False(self):
        self.assertFalse(g())

这取决于您的导入。假设您有一个称为module.py的模块,并且您有这样的导入:

from uuid import uuid4

这意味着在此模块中,我们现在有一个称为uuid4的变量。这是嘲笑的事情。

@patch('path.to.module.uuid4.int')

最新更新