如何在Python 3中对CherryPy Web应用程序进行单元测试?

乔布

我正在尝试对CherryPy中的Web应用程序进行单元测试。我找到的答案正是我要尝试的答案,但是它是用Python 2编写的,在使其在Python 3中运行时遇到了一些问题。这是我修改后的代码:

import unittest
from io import StringIO
import urllib

import cherrypy

local = cherrypy.lib.httputil.Host('127.0.0.1', 50000, "")
remote = cherrypy.lib.httputil.Host('127.0.0.1', 50001, "")

class Root(object):
    @cherrypy.expose
    def index(self):
        return "hello world"

    @cherrypy.expose
    def echo(self, msg):
        return msg

def setUpModule():
    cherrypy.config.update({'environment': "test_suite"})

    # prevent the HTTP server from ever starting
    cherrypy.server.unsubscribe()

    cherrypy.tree.mount(Root(), '/')
    cherrypy.engine.start()

setup_module = setUpModule

def tearDownModule():
    cherrypy.engine.exit()

teardown_module = tearDownModule

class BaseCherryPyTestCase(unittest.TestCase):
    def webapp_request(self, path='/', method='GET', **kwargs):
        headers = [('Host', '127.0.0.1')]
        qs = fd = None

        if method in ['POST', 'PUT']:
            qs = urllib.parse.urlencode(kwargs)
            headers.append(('content-type', 'application/x-www-form-urlencoded'))
            headers.append(('content-length', '%d' % len(qs)))
            fd = StringIO(qs)
            qs = None
        elif kwargs:
            qs = urllib.parse.urlencode(kwargs)


        # Get our application and run the request against it
        app = cherrypy.tree.apps['']
        # Let's fake the local and remote addresses
        # Let's also use a non-secure scheme: 'http'
        request, response = app.get_serving(local, remote, 'http', 'HTTP/1.1')
        try:
            response = request.run(method, path, qs, 'HTTP/1.1', headers, fd)
        finally:
            if fd:
                fd.close()
                fd = None

        if response.output_status.startswith(b'500'):
            print(response.body)
            raise AssertionError("Unexpected error")

        # collapse the response into a bytestring
        response.collapse_body()
        return response

class TestCherryPyApp(BaseCherryPyTestCase):
    def test_index(self):
        response = self.webapp_request('/')
        self.assertEqual(response.output_status, b'200 OK')
        # response body is wrapped into a list internally by CherryPy
        self.assertEqual(response.body, [b'hello world'])

    def test_echo(self):
        response = self.webapp_request('/echo', msg="hey there")
        self.assertEqual(response.output_status, b'200 OK')
        self.assertEqual(response.body, [b"hey there"])

        response = self.webapp_request('/echo', method='POST', msg="hey there")
        self.assertEqual(response.output_status, b'200 OK')
        self.assertEqual(response.body, [b"hey there"])

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

我从服务器收到意外的错误以进行POST测试:

/Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4 /Applications/PyCharm.app/Contents/helpers/pycharm/utrunner.py /Users/jweob/PyCharmProjects/coheat-network-control/testUiWebserver.py true
Testing started at 9:01 AM ...
[b'<!DOCTYPE html PUBLIC\n"-//W3C//DTD XHTML 1.0 Transitional//EN"\n"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html>\n<head>\n    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>\n    <title>500 Internal Server Error</title>\n    <style type="text/css">\n    #powered_by {\n        margin-top: 20px;\n        border-top: 2px solid black;\n        font-style: italic;\n    }\n\n    #traceback {\n        color: red;\n    }\n    </style>\n</head>\n    <body>\n        <h2>500 Internal Server Error</h2>\n        <p>The server encountered an unexpected condition which prevented it from fulfilling the request.</p>\n        <pre id="traceback">Traceback (most recent call last):\n  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/cherrypy/_cprequest.py", line 663, in respond\n    self.body.process()\n  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/cherrypy/_cpreqbody.py", line 996, in process\n    super(RequestBody, self).process()\n  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/cherrypy/_cpreqbody.py", line 540, in process\n    proc(self)\n  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/cherrypy/_cpreqbody.py", line 143, in process_urlencoded\n    qs = entity.fp.read()\n  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/cherrypy/_cpreqbody.py", line 858, in read\n    return ntob(\'\').join(chunks)\nTypeError: sequence item 0: expected a bytes-like object, str found\n</pre>\n    <div id="powered_by">\n      <span>\n        Powered by <a href="http://www.cherrypy.org">CherryPy 3.8.0</a>\n      </span>\n    </div>\n    </body>\n</html>\n']

Failure
Traceback (most recent call last):
  File "/Users/jweob/PyCharmProjects/coheat-network-control/testUiWebserver.py", line 82, in test_echo
    response = self.webapp_request('/echo', method='POST', msg="hey there")
  File "/Users/jweob/PyCharmProjects/coheat-network-control/testUiWebserver.py", line 64, in webapp_request
    raise AssertionError("Unexpected error")
AssertionError: Unexpected error


Process finished with exit code 0

我认为该错误与我在POST正文中编码消息的方式有关,但是我无法弄清楚我在做什么错。

乔布

我在这里找到了一个提示我应该使用io.BytesIO而不是使用io.StringIO,而不是

fd = StringIO(qs)

我用了

fd = BytesIO(qs.encode())

进行此更改后,示例可以正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在测试中为requirejs注入模块以对应用程序进行单元测试?

来自分类Dev

如何在基于Click的CLI应用程序的单元测试中模拟组件?

来自分类Dev

如何对旧的遗留应用程序进行单元测试

来自分类Dev

如何对部署在Tomcat上的Jersey Web应用程序进行单元测试?

来自分类Dev

如何对aiohttp.web应用程序进行单元测试

来自分类Dev

如何对ASP.NET Core Web应用程序(.Net Framework)进行单元测试?

来自分类Dev

如何使用 dart:html 对简单的 dart Web 应用程序进行单元测试

来自分类Dev

应用程序层单元测试在DDD中的外观如何?

来自分类Dev

如何在python中对递归函数进行单元测试?

来自分类Dev

如何在Xcode 6上对应用程序扩展进行单元测试

来自分类Dev

如何在ASP.NET MVC多层应用程序中正确进行单元测试?

来自分类Dev

如何在ASP.NET MVC多层应用程序中正确进行单元测试?

来自分类Dev

在Apache Camel应用程序中,单元测试如何将模拟端点注入真实端点?

来自分类Dev

当需要WPF应用程序时如何进行单元测试?

来自分类Dev

如何使用Twisted Trial在高速公路应用程序上进行单元测试?

来自分类Dev

如何对Node Js Express应用程序进行单元测试

来自分类Dev

如何开始为我的Android应用程序进行单元测试?

来自分类Dev

如何对iOS应用程序委托方法的调用进行单元测试?

来自分类Dev

在Visual Studio 2012中对C ++控制台应用程序进行单元测试

来自分类Dev

在Python 3中,如何在模块内部修补函数以进行单元测试?

来自分类Dev

如何在Visual Studio中对Windows 10应用进行单元测试?

来自分类Dev

Asp.Net Core MVC Web应用程序中的单元测试

来自分类Dev

如何在ViewModel中对OnPropertyChanged事件处理程序进行单元测试

来自分类Dev

如何在C#中以CQRS模式对命令处理程序进行单元测试

来自分类Dev

如何在Web API中对冲突响应的错误消息进行单元测试

来自分类Dev

如何编写Primefaces / JSF应用程序的单元测试

来自分类Dev

如何在Spring应用程序上下文中添加内部类以进行单元测试?

来自分类Dev

如何在Java中对ZipOutputStream进行单元测试

来自分类Dev

如何在MVP中对演示者进行单元测试

Related 相关文章

  1. 1

    如何在测试中为requirejs注入模块以对应用程序进行单元测试?

  2. 2

    如何在基于Click的CLI应用程序的单元测试中模拟组件?

  3. 3

    如何对旧的遗留应用程序进行单元测试

  4. 4

    如何对部署在Tomcat上的Jersey Web应用程序进行单元测试?

  5. 5

    如何对aiohttp.web应用程序进行单元测试

  6. 6

    如何对ASP.NET Core Web应用程序(.Net Framework)进行单元测试?

  7. 7

    如何使用 dart:html 对简单的 dart Web 应用程序进行单元测试

  8. 8

    应用程序层单元测试在DDD中的外观如何?

  9. 9

    如何在python中对递归函数进行单元测试?

  10. 10

    如何在Xcode 6上对应用程序扩展进行单元测试

  11. 11

    如何在ASP.NET MVC多层应用程序中正确进行单元测试?

  12. 12

    如何在ASP.NET MVC多层应用程序中正确进行单元测试?

  13. 13

    在Apache Camel应用程序中,单元测试如何将模拟端点注入真实端点?

  14. 14

    当需要WPF应用程序时如何进行单元测试?

  15. 15

    如何使用Twisted Trial在高速公路应用程序上进行单元测试?

  16. 16

    如何对Node Js Express应用程序进行单元测试

  17. 17

    如何开始为我的Android应用程序进行单元测试?

  18. 18

    如何对iOS应用程序委托方法的调用进行单元测试?

  19. 19

    在Visual Studio 2012中对C ++控制台应用程序进行单元测试

  20. 20

    在Python 3中,如何在模块内部修补函数以进行单元测试?

  21. 21

    如何在Visual Studio中对Windows 10应用进行单元测试?

  22. 22

    Asp.Net Core MVC Web应用程序中的单元测试

  23. 23

    如何在ViewModel中对OnPropertyChanged事件处理程序进行单元测试

  24. 24

    如何在C#中以CQRS模式对命令处理程序进行单元测试

  25. 25

    如何在Web API中对冲突响应的错误消息进行单元测试

  26. 26

    如何编写Primefaces / JSF应用程序的单元测试

  27. 27

    如何在Spring应用程序上下文中添加内部类以进行单元测试?

  28. 28

    如何在Java中对ZipOutputStream进行单元测试

  29. 29

    如何在MVP中对演示者进行单元测试

热门标签

归档