[英]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.