2015-06-21 186 views
0

我一直试图熟悉单元测试,但一直有很多麻烦。我有一个瓶子应用程序,我尝试使用Unittest,这似乎不合适,所以现在我正在尝试WebTest。WebTest单元测试瓶应用程序

麻烦的是,我甚至无法让它远程工作,甚至跟随着网站上最基本/肤浅的例子。

这里的例子:

from webtest import TestApp 
import mywebapp 

def test_functional_login_logout(): 
    app = TestApp(mywebapp.app) 

    app.post('/login', {'user': 'foo', 'pass': 'bar'}) # log in and get a cookie 

    assert app.get('/admin').status == '200 OK'  # fetch a page successfully 

    app.get('/logout')         # log out 
    app.reset()          # drop the cookie 

    # fetch the same page, unsuccessfully 
    assert app.get('/admin').status == '401 Unauthorized' 

我的代码:

@get('/') 
def page(): 
    letters = scorer.get_letter_set() 
    c = db_connect() 
    c.execute('SELECT player_name,score FROM Scores order by score DESC limit 5') 
    data = c.fetchall() 
    c.close() 

    return template('board', letters=letters, scores=data, letterset=json.dumps(letters)) 

然后,在控制台(一个问题是,我似乎无法得到任何测试代码从文件工作。如果我在我的项目目录中运行任何文件,bottle会运行开发服务器,而不是运行测试文件的任何尝试都会导致导入错误。)

>>> from webtest import TestApp 
>>> import board 
>>> app = TestApp(board.page) 
>>> res = app.get('/') 

我得到这个错误:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/webtest/app.py", line 322, in get 
    expect_errors=expect_errors) 
    File "/usr/local/lib/python2.7/dist-packages/webtest/app.py", line 605, in do_request 
    res = req.get_response(app, catch_exc_info=True) 
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1313, in send 
    application, catch_exc_info=True) 
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1281, in call_application 
    app_iter = application(self.environ, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/webtest/lint.py", line 198, in lint_app 
    iterator = application(environ, start_response_wrapper) 
TypeError: page() takes no arguments (2 given) 
+0

哪里是在你的代码的应用程序瓶? 'TestApp'是一个包装,而不是一个函数。 –

回答

0

的问题是在这里:

app = TestApp(board.page) 

相反,你需要用TestApp在你的瓶的应用程序,其中我假定(因为你没有显示它)住在board.py

所以,这样的事情应该修复它:

app = TestApp(board.app) 
0

正如@ ron.rothman提到,问题是,你试图包装内TestApp而不是应用程序的方法。

从你的代码 -

@get('/') 
def page(): 
    letters = scorer.get_letter_set() 
... 

其明显的是,你使用的是默认的应用程序,而不是创建自己的瓶的一个实例。

FIX-

进行以下changes-

  1. 之前你页面添加这些前两行()方法 -

    app = Bottle() 
    @app.get('/') 
    def page(): 
        letters = scorer.get_letter_set() 
    ... 
    
  2. 确保您保存文件包含您以上代码为mywebapp.py

  3. 在你的单位测试代码,写在包装线像这个 -

    def test_functional_login_logout(): 
        app = TestApp(mywebapp.app) 
    ...