繁体   English   中英

Python Mock:如何模拟函数内部的方法?

[英]Python Mock: How to mock a method inside a fucntion?

我有一个函数,我想在其中模拟一个方法 run_insert()

结构:

"backened/routes/register.py"

def user_regsiter():
         service_register(request_data)


"backened/services/service_register.py"

def service_register(request_data):
         #some code
         validate()

         #some code
         run_insert(data)

在此 user_register() 中将调用 service_register() 并在该 service_register()-> validate() 和 run_insert(data) 中

所以,我想在测试函数中模拟 run_register(data)

"backened/sql/query_functions.py"

def run_insert(data):
    conn = connection()
    sql = text(CONST_INSERT) 
    print(sql)
    conn.execute(sql, data)
    conn.close()
    return ("executed")

这是我尝试过的但出现 AssertionError: Expected 'run_insert' to have been called once。 调用0次

"backened/tests/test_users.py"

    @patch('backened.sql.query_functions.connection') 
    @patch('backened.sqlquery_functions.run_insert', return_value = "executed")
    def test_service_reg_return_correct_data(self, mock_sqlalchemy, mock_insert):
        
        data = {                                                              
            "user_name": "testuser57",
            "password": "123456",
            "email_address": "testuser57@example.com",
            "dob": "2022-06-07 00:00:00",
            "address": "Ahmedabad",
            
        }
        
        # json_data = json.dumps(data)
        # print("jsob", json_data)

        

        m1 = mock.MagicMock()
        m1.get_json.return_value = data
       

        print("m", m1)
        with mock.patch("backened.routes.register.request", m1):
            
            response =user_register()
            mock_sqlalchemy.assert_called_once()
            mock_insert.assert_called_once() 
            self.assertEqual(response.json, {'Message': 'New user Created'},201) 

如何模拟 run_insert(data)?

这是一个在您的问题中受到启发的功能性和概念性示例。 您确实需要根据您的需要进行调整。

这里的要点是什么。

  • sql_insert_data是一个返回字典的方法
  • service_register是一个执行业务逻辑的方法,以前面的方法为辅助
  • patch方法必须有你想要模拟的对象+方法的路径
from sqlite3 import connect
from unittest import main, TestCase
from unittest.mock import patch


def sql_insert_data(data):
    conn = connect(":memory:")
    strSQL = "INSERT OR IGNORE INTO table (field_1, field_2) VALUES (?, ?)"
    print(strSQL)
    conn.execute(strSQL, data)
    conn.close()
    return {'status': 'success'}

def service_register(row_data):
    sql_insert_data(row_data)
    return True


class TestMainService(TestCase):

    def test_service_register(self):
        with patch('__main__.sql_insert_data', return_value={'status': 'success'}) as mock_sql:
            service_register([123, 456])
            mock_sql.assert_called_once()

if __name__ == '__main__':
    main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM