How to supply a mock class method for python unit test?

后端 未结 3 1194
名媛妹妹
名媛妹妹 2021-02-03 20:43

Let\'s say I have a class like this.

   class SomeProductionProcess(CustomCachedSingleTon):

       def loaddata():
           \"\"\"
           Uses an iterator         


        
3条回答
  •  囚心锁ツ
    2021-02-03 21:44

    Lets say you have a module named awesome.py and in it, you had:

    import time
    
    class SomeProductionProcess(CustomCachedSingleTon):
    
        def loaddata(self):
            time.sleep(30) # simulating a long running process
            return 2
    

    Then your unittest where you mock loaddata could look like this:

    import unittest
    
    import awesome # your application module
    
    
    class TestSomeProductionProcess(unittest.TestCase):
        """Example of direct monkey patching"""
    
        def test_loaddata(self):
            some_prod_proc = awesome.SomeProductionProcess()
            some_prod_proc.loaddata = lambda x: 2 # will return 2 every time called
            output = some_prod_proc.loaddata()
            expected = 2
    
            self.assertEqual(output, expected)
    

    Or it could look like this:

    import unittest
    from mock import patch
    
    import awesome # your application module
    
    class TestSomeProductionProcess(unittest.TestCase):
        """Example of using the mock.patch function"""
    
        @patch.object(awesome.SomeProductionProcess, 'loaddata')
        def test_loaddata(self, fake_loaddata):
            fake_loaddata.return_value = 2
            some_prod_proc = awesome.SomeProductionProcess()
    
            output = some_prod_proc.loaddata()
            expected = 2
    
            self.assertEqual(output, expected)
    

    Now when you run your test, loaddata wont take 30 seconds for those test cases.

提交回复
热议问题