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



我有一个函数,我想在其中模拟一个方法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:预期的'run_insert'已被调用一次。被调用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()

最新更新