ImportError:在运行单元测试时尝试使用没有已知父包的相对导入

问题描述 投票:0回答:1

This is my folder structure

这是我的单元测试代码

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()
python python-3.x unit-testing python-unittest
1个回答
0
投票

我想你的文件

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()
© www.soinside.com 2019 - 2024. All rights reserved.