这是我的单元测试代码
import unittest
from unittest.mock import patch, Mock
from ..services.user_service import UserService
class CreateUserTestCase(unittest.TestCase):
#Mock Data
full_name = "John Doe"
phone_number = "1234567890"
email = "[email protected]"
def test_create_user_service_success(self, mock_user_class):
# Create a mock for the User model
mock_user = Mock()
# Mock the save method of the User model
mock_user.save.return_value = None
# Replace the actual User class with the mock
with patch('Models.models.User', mock_user): # Corrected the patch path
# Call the service method
result = UserService.create_user(self.full_name, self.phone_number, self.email)
# Assertions
# assert result is not None # Ensure the service method returns a result
# assert mock_user.call_args == call(role_name="Admin", slug="admin", is_system_defined=True)
assert mock_user.save.called_once()
我在测试目录中尝试的命令是 -
python3 -m unittest test_user_service.py
显示错误 - /api/v1/tests/test_user_service.py”,第 3 行,在 从 ..tests.test_user_service 导入 UserService ImportError:尝试在没有已知父包的情况下进行相对导入
create_user 函数-
class UserService:
def create_user(email: str):
try:
user = User()
user.email = email
user.save()
return user.to_json()
except Exception as e:
return None
更新代码-
import sys
import os
project_dir =
os.path.abspath(os.path.join(os.path.dirname(__file__),
"...."))
sys.path.append(project_dir)
import unittest
from unittest.mock import patch, Mock
from api.v1.services.user_service import UserService
from Models.models import User
class CreateUserTestCase(unittest.TestCase):
#Mock Data
full_name = "John Doe"
phone_number = "1234567890"
email = "[email protected]"
@patch("Models.models.User")
def test_create_user_service_success(self, mock_user_class):
mock_user = mock_user_class.return_value
mock_user.save.return_value = mock_user
result = None
result = UserService.create_user(self.email)
assert mock_user.save.called_once()
我想你的文件
user_service.py
包含导入:
from Models.models import User
如果这是真的,您的文件
test_user_service.py
必须更改如下:
import sys
import os
project_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) # <--- here I have changed '....' to "../../.."
sys.path.append(project_dir)
import unittest
from unittest.mock import patch, Mock
from api.v1.services.user_service import UserService
from Models.models import User
class CreateUserTestCase(unittest.TestCase):
# Mock Data
full_name = "John Doe"
phone_number = "1234567890"
email = "[email protected]"
#@patch("Models.models.User") # <--- Changed this patch() instruction
@patch("api.v1.services.user_service.User")
def test_create_user_service_success(self, mock_user_class):
mock_user = mock_user_class.return_value
#mock_user.save.return_value = mock_user # <--- this instruction must be commented
result = None
result = UserService.create_user(self.email)
#assert mock_user.save.called_once() # <--- this test IS NOT CORRECT
mock_user.save.assert_called_once()
if __name__ == '__main__':
unittest.main()