2013-07-01 83 views
1

我是新來的Python和燒瓶,但我正在逐漸掌握它。我到目前爲止已經構建了一個應用程序,現在我想我應該開始一些單元測試。儘管如此,我確實無法理解。我已閱讀各種文檔,帖子和示例,但我似乎無法將此轉換爲我自己的代碼。我希望如果有人能告訴我如何爲我的一項功能編寫測試,那麼事情就會落實到位。在這個階段非常有誘惑力,可以忽略它並按下我的應用程序。單元測試燒瓶功能(使用登錄用戶)

@app.route('/user/<nickname>/create_bike', methods = ['GET', 'POST']) 
@login_required 
def create_bike(nickname): 
    user = User.query.filter_by(nickname = nickname).first() 
    bikes = user.bikes.all() 
    bikecount = user.bikes.count() 
    form = CreateBike() 
    if form.validate_on_submit(): 
     if bikecount < user.bike_allowance: 
      # let user create a bike 
      newbike = Bikes(bikename = form.bikename.data, 
       user_id = g.user.id, shared = SHARED) 
      db.session.add(newbike) 
      db.session.commit() 
      flash('Your new bike has been created') 
      return redirect(url_for('create_bike', nickname = nickname)) 
     else: 
      flash("You have too many bikes") 
    return render_template('create_bike.html', 
     user = user, 
     form = form 
     ) 

更新 - 這是我的工作測試

def test_create_bike(self): 
    u = User(nickname = 'john', email = '[email protected]', account_type = "tester") 
    db.session.add(u) 
    db.session.commit() 
    # login user 
    with self.app as c: 
     with c.session_transaction() as sess: 
      sess['user_id'] = int(u.get_id()) 
      # http://pythonhosted.org/Flask-Login/#fresh-logins 
      sess['_fresh'] = True 
     rv = c.post('/user/john/create_bike', data = dict(
      bikename = 'your new bike', 
      user_id = sess['user_id'], 
      shared = 1 
     ), follow_redirects = True) 
     assert 'Your new bike has been created' in rv.data 

回答

2

您的測試可能失敗,因爲該視圖需要登錄用戶,並且自您沒有傳入任何會話數據,您將被重定向到登錄頁面(data參數.post是表單數據,在您的視圖中可用request.form)。你的斷言之前,你可以看到的反應是什麼幫助你前進的道路:

print rv.status_code 
print rv.location #None if not a redirect 

有各地的測試here會議的一些文件,如果你正在使用燒瓶登錄像它看起來你是,this answer節目你如何設置會話,所以你得到一個登錄用戶

+0

這確實是問題所在,我現在正在進行測試。謝謝你的回答。 – bobwal

0

你在正確的軌道上。

檢查html頁面是否包含某些應該存在的數據片段是測試Web應用程序中最常見的一種情況。您只需重複您創建的所有其他頁面。您還可以添加測試,以查看創建用戶是否遵循您已設置的所有驗證規則或用戶名字段是否唯一等。

+0

感謝您的答覆。不幸的是,這個測試返回一個斷言錯誤。我覺得我在盲目工作,很難知道爲什麼測試失敗,所以我正在嘗試嘗試和錯誤,這並沒有讓我走得很遠。 – bobwal

+0

在assert語句的頁面中嘗試另一個字符串。 Flash消息是動態生成的,所以它們需要像硒那樣的JS運行時才能被測試。 – raphonic

+0

Flash消息存儲在會話中,絕對可以呈現在服務器端:http://flask.pocoo.org/docs/patterns/flashing/ – DazWorrall