模拟修补程序找不到路径

2024-09-30 10:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我在模拟函数时遇到了一些问题。它正在引发ValueError异常,无法模拟该属性

文件夹结构

root
     \api
         ProjectFolder
              ProjectDetails.py
      \GetProjectList
         main.py
         __init__.py
      \test
         test_projectList.py
         __init__.py

我从ProjectDetails.py文件中的类“ProjectList”调用了一个函数“get\u ProjectList”。这是其他文件

main.py

import logging
import azure.functions as func

from api.ProjectFolder.ProjectDetails import *

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Trigger function for get projects list.')

    response, status_code = ProjectList().get_ProjectList()
    return func.HttpResponse(response,status_code=status_code)

测试项目列表.py

from unittest import mock
import unittest
from GetProjectList.main import *
import azure.functions as func

class Test_ProjectDetails(unittest.TestCase):    

    def test_ProjectDetails(self):
        with mock.patch('api.ProjectFolder.ProjectDetails.ProjectList.get_ProjectList') as mock_get:
        
             mock_get.return_value.status_code = 200
            
             req = func.HttpRequest(
                   method='GET',
                   body=None,
                   url='/GetProjectList'
                  )

             resp = main(req)

         expected_status_code = 200

         self.assertEqual(resp.status_code,expected_status_code)  
if __name__ == '__main__':
    unittest.main()

当我运行此命令时,它抛出异常,表示ValueError:没有足够的值从main.py解包(预期为2,得到0),并在响应处显示行,状态\u code=ProjectList().get\u ProjectList()

**复制代码时如果缩进错误,则忽略


Tags: pytestimportapigetmainstatuscode
2条回答

mock_get.return_value.status_code = 200使函数的模拟返回只有一个值(整数200)。
在主节中,response, status_code = ProjectList().get_ProjectList()预计get_ProjectList()将返回2个值。
我建议您更改mock,使其返回2个值,例如:
mock_get.return_value.status_code = (200, 200)
然后函数的mock将返回一个包含2个参数的元组(就像从原始函数返回2个参数),并且主代码将有一些第二个值需要解包

我通过在测试文件中进行以下更改来实现这一点

from unittest import mock
import unittest
from GetProjectList.main import *
import azure.functions as func

class Test_ProjectDetails(unittest.TestCase):    

      def test_ProjectDetails(self):
          with mock.patch('GetProjectList.main.ProjectList.get_ProjectList') as mock_get:
    
               mock_get.return_value = (<message>,200)
        
               req = func.HttpRequest(
                     method='GET',
                     body=None,
                     url='/GetProjectList'
               )

               resp = main(req)

           expected_status_code = 200

           self.assertEqual(resp.status_code,expected_status_code)  
if __name__ == '__main__':
    unittest.main()

相关问题 更多 >

    热门问题