首页 > 解决方案 > 模拟调用另一个方法的方法

问题描述

假设我有一个带有方法的测试类 TestSuite test_database_inaccessible()。我想run()在另一个类中测试一个方法,AA_database.run()调用 is_primary(). 我可以模拟 is_primary 以返回 True。

我努力了

 with patch.object(AADatabase, "is_primary") as is_primary_mocked:
     self.dbsize = 2.1e10
     self.returncode = 2
     is_primary_mocked.return_value = True
     self.AADatabase.run()           

但我明白了

AttributeError:“TestSuite”对象没有属性“AADatabase”

以前,我曾简单地尝试过

 with patch.object(AADatabase, "is_primary") as is_primary_mocked:
        self.dbsize = 2.1e10
        self.returncode = 2
        is_primary_mocked.return_value = True
        AADatabase.run()

但是我收到了不同的错误信息。

如果补丁在这里是错误的工具,我不介意切换到不同的工具。我已经尝试了很多不同的方法。

标签: pythonmockingpython-unittest

解决方案


Here is the unit test solution based on the code you provided.

main.py:

class AADatabase:
    @classmethod
    def is_primary(cls):
        return False

    @classmethod
    def run(cls):
        return cls.is_primary()

test_main.py:

import unittest
from main import AADatabase
from unittest.mock import patch


class TestAADatabase(unittest.TestCase):
    def test_database_inaccessible(self):
        with patch.object(AADatabase, 'is_primary') as is_primary_mocked:
            is_primary_mocked.return_value = True
            res = AADatabase.run()
            self.assertTrue(res)


if __name__ == '__main__':
    unittest.main()

Unit test result with coverage report:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
src/stackoverflow/58862981/main.py            5      1    80%   4
src/stackoverflow/58862981/test_main.py      11      0   100%
-----------------------------------------------------------------------
TOTAL                                        16      1    94%

Source code: https://github.com/mrdulin/python-codelab/tree/master/src/stackoverflow/58862981


推荐阅读