繁体   English   中英

如何修复 Azure Function (Python) 测试错误与 Http 触发器和队列消息 Z29C2C44725E

[英]How To Fix Error For Test of Azure Function (Python) With Http Trigger and Queue Message Output

在 python Azure Function 上运行测试时出现以下错误:

obj = super().__new__(cls, *args, **kwds)
TypeError: object.__new__() takes exactly one argument (the type to instantiate)

当 function 调用 msg.set() 时出现错误,因为我从测试中传入的值不正确。

这是我正在测试的 function:

import logging    
import azure.functions as func
    
def main(req: func.HttpRequest, msg: func.Out[func.QueueMessage]) -> func.HttpResponse:
    
    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        msg.set(name)
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

这是测试代码:

# test_some.py
import unittest
import azure.functions as func

from . import main

class Test_Some(unittest.TestCase):
    def test_my_function_for_no_name(self):
        testVal = 'Some Guy'
        # Construct a mock HTTP request.
        req = func.HttpRequest(
            method='GET',
            body=None,
            url='/api/HttpExample',
            params={'name': testVal})

        queue_msg = func.QueueMessage(body=b'')

        msg = func.Out(queue_msg)

        # Call the function.
        resp = main(req, msg)

        # Check the output.
        self.assertEqual(
            resp.get_body(),
            b'Hello Some Guy!',
        )

if __name__ == '__main__': unittest.main()

测试代码应该是:

# HttpTrigger1/test_queryurls.py
from . import main
import unittest
import logging
import azure.functions as func

class Test_Some(unittest.TestCase):
    def test_my_function_for_no_name(self):
        testVal = 'Some Guy'
        # Construct a mock HTTP request.
        req = func.HttpRequest(
            method='GET',
            body=None,
            url='/api/HttpExample',
            params={'name': testVal})

        queue_msg = func.QueueMessage(body=b'')
        queue_msg.__setattr__('set', set)

        resp = main(req, queue_msg)

        # Check the output.
        self.assertEqual(
            resp.get_body(),
            b'Hello Some Guy!',
        )

    def set(inStr:str):
        logging.info(inStr)

if __name__ == '__main__': unittest.main()

问题是如何组合第二个 object 从单元测试传递到 function。 第二个 object 的 function 签名是 msg: func.Out[func.QueueMessage]。 func.Out 是一个抽象的 class 所以不能被实例化。 func.QueueMessage 可以被实例化,但没有设置方法,因此不能按原样使用。 因此,我创建了一个 func.QueueMessage object 并使用setsttr向 object 添加了一个空白集方法。 如果我需要它做更多的事情,我可能会修改新的“set”方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM