模拟调用另一个方法的方法

时间:2019-11-14 17:52:06

标签: python mocking python-unittest

假设我有一个方法为test_database_inaccessible()的测试类TestSuite。我想在另一个类中测试方法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()

但是我得到了不同的错误消息。

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

1 个答案:

答案 0 :(得分:1)

这是基于您提供的代码的单元测试解决方案。

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()

带有覆盖率报告的单元测试结果:

.
----------------------------------------------------------------------
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%

源代码:https://github.com/mrdulin/python-codelab/tree/master/src/stackoverflow/58862981