2016-04-08 4 views
1

Я изучаю, как тестировать функции в Python с помощью Mock. Я пытаюсь написать тест для простой функции,Python Mock Testing to moker session

@social.route('/friends', methods=['GET', 'POST']) 
def friends(): 
    test_val = session.get('uid') 
    if test_val is None: 
     return redirect(url_for('social.index')) 
    else: 
     return render_template("/home.html") 

Однако, я застрял на том, чтобы попытаться («UID») значения издеваться session.get. До сих пор это была моя попытка,

@patch('session', return_value='') 
@patch('flask.templating._render', return_value='') 
def test_mocked_render(self, mocked, mock_session): 
    print "mocked", repr(self.app.get('/social/friends').data) 
    print "was _render called?", mocked.called 

Эта попытка может быть совершенно неправильно, и это, безусловно, неправильно, как я до сих пор не в состоянии дразнить сессии. Однако, может кто-нибудь, пожалуйста, проведет меня правильно? Благодарю.

+0

Вы не издеваться сеанса (или рендеринга шаблона), вы будете использовать тестовый клиент, как описано в документации колба. Почему вы пытаетесь издеваться над этим? – davidism

+0

Я был в предположении, что его нужно издеваться, чтобы проверить этот метод. Кроме того, у меня появилось несколько запросов к базам данных, которые, насколько я понял, нужно издеваться, чтобы проверить его. Можете ли вы дать мне пример кода, как бы проверить эту функцию? – user2297790

ответ

1

Начиная с Flask 0.8 мы предоставляем так называемую «сеансовую транзакцию», которая имитирует соответствующие вызовы для открытия сеанса в контексте тестового клиента и для его изменения.

Давайте приведем простой пример: app.py

from flask import Flask, session 

app = Flask(__name__) 
app.secret_key = 'very secret' 


@app.route('/friends', methods=['GET', 'POST']) 
def friends(): 
    test_val = session.get('uid') 
    if test_val is None: 
     return 'uid not in session' 
    else: 
     return 'uid in session' 


if __name__ == '__main__': 
    app.run(debug=True) 

Тест файла: test_app.py

import unittest 

from app import app 


class TestSession(unittest.TestCase): 
    def test_mocked_session(self): 
     with app.test_client() as c: 
      with c.session_transaction() as sess: 
       sess['uid'] = 'Bar' 
      # once this is reached the session was stored 
      rv = c.get('/friends') 
      assert rv.data == 'uid in session' 


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

запустить тесты через python test_app.py.

Документация: Accessing and Modifying Sessions